

|12//****************************************************************|07
|12//*** Demonstrace sifry BCHI pro Vyhen napsal HIPP 1996 *********
|12//****************************************************************|07
|02#include <stdio.h>|07
|02#include <stdlib.h>|07
|02#include <io.h>|07
|02#include <fcntl.h>|07
|02#include <string.h>|07
|02#define NOFR 1 |12//pocet opakovani|07
|12//************************ je pismeno nebo cislo? **************|07
unsigned char isalnum(unsigned char ch){
 if (((ch>47) && (ch<58)) ||
     ((ch>64) && (ch<91)) ||
     ((ch>96) && (ch<123))) return 1;
 return 0;
}
|12//************************ z klice urcuje poradi sloupcu ********|07
|12//permutacni vysisleni|07
unsigned char * pofc(const char str[]){
 |12//delka klice, minimum, umisteni minima, citac|07
 unsigned char len,min,where,c,d;
 unsigned char * ch;|12//retezec s poradim prvku|07
 char *s;
 s=strdup(str);
 len=strlen(s);
 ch=(char *)malloc(len+1);
 for (c=0;c<len;c++){
  min=255;
  for (d=0;d<len;d++)
    if (s[d]<min) {min=s[d];where=d;}
  *(ch+c)=where;
  s[where]=255;
 }
 s[len]=0;
 return ch;
}
|12//*************************** MAIN *********************************
main(int argc,char ** argv){|07
 FILE * file;|12//soubor|07
 unsigned char * imsg, * omsg;|12//vstupni, vystupni zprava|07
 unsigned char * key,e;
 char sd;|12//sifruje / desifruje|07
 |12//delka souboru,citac,delka klice,posice|07
 unsigned length,c,d,len,posi,poso;
 printf("\nDemonstrace sifry BCHI pro Vyhen napsal HIPP 1996\n");
 if (argc<5) {
  fprintf(stderr,"ubchi s/d vstupni.sou sifrfraze vystup.sou\nNapr:\
  ubchi s input.dat tralala output.dat\n");
  return -1;
 }
 if ((argv[1][0]=='s') || (argv[1][0]=='S')) sd=0;
 else sd=1;
 if ((file=fopen(argv[2],"r"))==NULL){
   fprintf(stderr,"Nejde otevrit soubor %s \n",argv[2]);
   return -1;
 }
 |12//************************ nacita zpravu ze souboru **************|07
 length=filelength(fileno(file));
 imsg=(char *)malloc(length);
 fread(imsg,length,1,file);
 fclose(file);
 |12//************************ z klice urcuje poradi sloupcu ********|07
 key=pofc(argv[3]);
 len=strlen(argv[3]);
 |12//************************ sifruje ******************************|07
 omsg=(char *)malloc(length);
 for (e=0;e<NOFR;e++){
  if (e>0) memcpy(imsg,omsg,length);
  poso=0;
  for (c=0;c<len;c++)
   for (d=0;(posi=key[c]+d*len)<length;d++,poso++)
      if (sd)  omsg[posi]=imsg[poso];|12//desifruje|07
      else     omsg[poso]=imsg[posi];|12//sifruje|07

 }
 free(imsg);
 if ((file=fopen(argv[4],"w"))==NULL){
      fprintf(stderr,"Nejde vytvorit soubor %s\n",argv[4]);
      free(omsg);
      return -2;
 }
 fwrite(omsg,length,1,file);
 fclose(file);
 free(omsg);
 return 0;
}

