www.pudn.com > cryptology.rar > vigenere.cpp
#include#include #include void encrypt(int *,int ); void decrypt(int *,int ); void frequency(void); void main(){ int i=0,n=0,*key; printf("输入密钥字长度:\n"); scanf("%d",&n); srand(time(NULL)); key=new int[n]; for(i=0;i<=n-1;i++){ *(key+i)=rand()%26; } printf("密钥生成结果:"); for(i=0;i<=n-1;i++) printf("%d ",*(key+i)); putchar('\n'); int choice=-1; printf("主菜单:输入1加密,输入2解密,输入3统计频率,输入-1退出\n"); scanf("%d",&choice); while(choice!=-1){ switch(choice){ case 1: encrypt(key,n); break; case 2: decrypt(key,n); break; case 3: frequency(); } scanf("%d",&choice); } } void encrypt(int *key,int n){ int counter=0; char c; FILE *plainfptr,*cipherfptr; if((plainfptr=fopen("21.txt","r"))==NULL|| (cipherfptr=fopen("22.txt","w"))==NULL) printf("ERROR!"); else{ while((c=fgetc(plainfptr))!=EOF){ c=(c-'a'+key[counter%n])%26+'A'; counter++; fputc(c,cipherfptr); } } fclose(plainfptr); fclose(cipherfptr); printf("加密完成!\n"); } void decrypt(int *key,int n){ int counter=0; char c; FILE *plainfptr,*cipherfptr; if((cipherfptr=fopen("22.txt","r"))==NULL|| (plainfptr=fopen("23.txt","w"))==NULL) printf("ERROR!"); else{ while((c=fgetc(cipherfptr))!=EOF){ c=(c-'A'+26-key[counter%n])%26+'a'; counter++; fputc(c,plainfptr); } } fclose(plainfptr); fclose(cipherfptr); printf("解密完成!\n"); } void frequency(void){ FILE *fptr; int i=0,choice=-1,tag,counter[26]={0},sum=0; float p[26],Ic=0.0; printf("统计频率菜单:输入1统计明文频率,输入2统计密文频率\n"); scanf("%d",&choice); switch(choice){ case 1: fptr=fopen("21.txt","r"); tag=1; break; case 2: fptr=fopen("22.txt","r"); tag=2; break; } char c; if(tag==1){ while((c=fgetc(fptr))!=EOF){ counter[c-'a']++; sum++; } for(i=0;i<=25;i++){ putchar(i+'a'); printf(": %d\n",counter[i]); } printf("%d chars in all\n",sum); } else{ while((c=fgetc(fptr))!=EOF){ counter[c-'A']++; sum++; } for(i=0;i<=25;i++){ putchar(i+'A'); printf(": %d\n",counter[i]); } printf("%d chars in all\n",sum); } for(i=0;i<=25;i++){ p[i]=(float)counter[i]/sum; Ic+=p[i]*p[i]; } printf("The Ic is %f\n",Ic); }