//******PROGRAM PRO DEMONSTRACI VIGENEROVI SIFRY A TABULY RECTY
//******PRO VYHEN HIPP 1996
#include <stdio.h>
#include <string.h>
#include <conio.h>
#include <ctype.h>
#define byte unsigned char
//delka abecedy
#define N 26
//otazecka
char quest(char s[],char a,char b){
 char co;
 printf("%s",s);
 do {
     co=toupper(getch());
 }
 while ((co!=a) && (co!=b));
 return co;
}

//testuje je-li string
char isstring(char s[]){
 char c,l;
 l=strlen(s);
  for (c=0;c<l;c++) {
      s[c]=toupper(s[c]);
      if ((s[c]<65) || (s[c]>90)) return 0;
  }
 return l;
}
char main(int argc,char ** arg){
 FILE * f1, * f2;//vstupni vystupni soubor
 char co=0,klic [50],sd;//co=typ sifry, klic, desifrovat ci sifrovat
 int ch;
 byte len,pos=0;//delka klice, posice v klici
 printf("\nProgram na sifrovani souboru (HIPP 1996)\n\n");
 if (argc<2) {//malo parametru
        printf("sifr sou1.txt [sou2.txt]\n");
        return -1;
       }
 if ((f1=fopen(arg[1],"r"))==NULL) {
        fprintf(stderr,"Nelze otevrit soubor %s\n",arg[1]);
        return -1;
        }
  if (argc>2){
      if ((f2=fopen(arg[2],"w"))==NULL)
        {
          fprintf(stderr,"Nelze vytvorit soubor %s\n",arg[2]);
          return -1;
      }
  }
  else f2=stdout;
 sd=quest("\nChces Sifrovat = S\n    Desifrovat = D\n",'S','D');
 co=quest("\nKterou sifru chces pouzit ?\nTabula recta = T\nVigenere     = V\n",
 if (co=='V')
 do{
       printf("Zadej klic : ");
       scanf("%s",klic);
  } while (!(len=isstring(klic)));
 //pozmenuje klic pro desifrovani vigenere (N-(a-65))+65=156-a
 if ((sd=='D') && (co=='V')) for (ch=0;ch<len;ch++)  klic[ch]=156-klic[ch];
 while ((ch=fgetc(f1))!=EOF){
   ch=toupper(ch);
   if ((ch>64) && (ch<91)) {
      //vigenere
      if (co=='V') {
      if (pos==len) pos=0;
      ch=((ch-65) + (klic[pos]-65)) % N + 65;
      }
      //recta
      if (co=='T'){
      if (pos==N) pos=0;
      if (sd=='S') ch=((ch-65) + pos) % N + 65;
      else ch=((ch-65) + (N-pos)) % N + 65;
     }
   pos++;
 }
  fprintf(f2,"%c",ch);
 }
 fclose(f1);
 fclose(f2);
}


            výheň