//******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ň