#include #include #include /*** crypto by Daniele Raffo 29.10.97 ***/ char code_simm1(char input); char code_simm2(char input); int code_spost(char input, int chiavenum, char op); char code_enigma(char input, char op); char code_cesare(char input, int chiavenum, char op); char code_vigenere(char input, char chiavealfa[], int ec, char op); int flag2; /* variabile di sistema, esterna */ main() { int i, j, h, flag; char cont; /* variabili di sistema */ char frase[80]; /* frase da elaborare */ int cod; /* codice da usare, scelto da menu */ int chiavenum; char chiavealfa[80]; /* chiave: numerica e alfabetica */ char op; /* operazione: c=codifica, d=decod */ int ec; /* indice ultimo carattere chiave */ printf("\n\n\n AUTO MULTICODE CRYPTOGRAPHER\n"); printf(" by Daniele Raffo 29.10.97\n"); printf(" per l'esame di Algoritmi e Strutture Dati"); do { do { printf("\n\n\n\n 1 - Mappaggio Ascii simmetrico\n"); printf(" 2 - Mappaggio Ascii simmetrico con inclusione DEL\n"); printf(" 3 - Mappaggio Ascii a spostamento\n"); printf(" 4 - Codice Enigma\n"); printf(" 5 - Cifrario di Cesare\n"); printf(" 6 - Vigenere\n"); printf(" 0 - uscita\n"); printf("\nCodice crittografico da usare: "); scanf("%d",&cod); } while (cod<0 || cod>6); switch (cod) { case 1: case 2: printf("Chiave fissa\nCodifica=Decodifica\n"); break; case 3: do { printf("Chiave (numerica 1-94): "); /* ciclica 0=95=idem */ scanf("%d",&chiavenum); } while (chiavenum<1 || chiavenum >94); printf("Codifica o decodifica (c,d): "); scanf("%s1",&op); break; case 4: printf("Chiave prefissata in programma\n"); /* vedi oltre */ printf("Codifica o decodifica (c,d): "); scanf("%s1",&op); break; case 5: do { printf("Chiave (numerica 1-25): "); /* ciclica 0=26=idem */ scanf("%d",&chiavenum); } while (chiavenum<1 || chiavenum >25); printf("Codifica o decodifica (c,d): "); scanf("%s1",&op); break; case 6: do { printf("Chiave (alfabetica): "); flag=0; fflush(stdin); ec=-1; do {ec++; chiavealfa[ec]=toupper(getchar());} while (chiavealfa[ec]!='\n'); ec=ec-1; for (h=0; h<=ec; h++) {if (chiavealfa[h]<65 || chiavealfa[h]>90) flag=1;} } while (flag); printf("Codifica o decodifica (c,d): "); scanf("%s1",&op); break; } if (cod) { printf("\nFrase da elaborare:\n"); fflush(stdin); i=-1; do {i++; frase[i]=getchar();} while (frase[i]!='\n'); flag2=0; /* resetta l'indice della chiave del vigenere */ for (j=0; j126) output=output-126+31; if (output<32) output=output+126-31; return(output); } char code_enigma(char input, char op) { static char base[36]="ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; static char codf[36]="WSUJVEZTKLDYBPMANCGXORIHFQ9731280465"; /* chiave prefissata */ int i; if (op=='c') { for (i=0;i<36;i++) { if (toupper(input)==base[i]) return(codf[i]); } return(input); } else { for (i=0;i<36;i++) { if (toupper(input)==codf[i]) return(base[i]); } return(input); } } char code_cesare(char input, int chiavenum, char op) { char output; if (op=='d') chiavenum=-chiavenum; input=toupper(input); if (input<65 || input>90) return(input); else { output=input+chiavenum; if (output>90) output=output-90+64; if (output<65) output=output+90-64; return(output); } } char code_vigenere(char input, char chiavealfa[], int ec, char op) { char output; static int ichiave=0; /* conserva il suo valore ad ogni accesso alla funzione... */ if (flag2==0) { ichiave=0; flag2=1; } /* ...ma va resettata quando si ricomincia una codifica */ input=toupper(input); if (input<65 || input>90) return(input); else { if (op=='d') output=input-(chiavealfa[ichiave]-65); else output=input+(chiavealfa[ichiave]-65); if (output>90) output=output-90+64; if (output<65) output=output+90-64; } ichiave++; if (ichiave==ec+1) ichiave=0; return(output); }