www.pudn.com > cryptology.rar > affine.cpp
#include#include #include int gcd(int ,int ); int ani(int ); void encrypt(int ,int ); void decrypt(int ,int ); void frequency(void); void main(){ int a,b,a1; srand(time(NULL)); do{ a=rand()%26; }while(gcd(a,26)!=1); b=rand()%26; printf("仿射密钥为:Y=%d*X+%d\n",a,b); a1=ani(a); int choice=-1; printf("主菜单:输入1加密,输入2解密,输入3统计频率,输入-1退出\n"); scanf("%d",&choice); while(choice!=-1){ switch(choice){ case 1: encrypt(a,b); break; case 2: decrypt(a1,b); break; case 3: frequency(); } scanf("%d",&choice); } } int gcd(int a,int b) { int temp; while(b!=0) { temp = a; a = b; b = temp%b; } return a; } int ani(int a) { int i; for(i = 0;i < 26;i++) if((a*i)%26 == 1) return i; return 0; } void encrypt(int a,int b){ int counter=0; char c; FILE *plainfptr,*cipherfptr; if((plainfptr=fopen("11.txt","r"))==NULL|| (cipherfptr=fopen("12.txt","w"))==NULL) printf("ERROR!"); else{ while((c=fgetc(plainfptr))!=EOF){ c=(a*(c-'a')+b)%26+'A'; counter++; fputc(c,cipherfptr); } } fclose(plainfptr); fclose(cipherfptr); printf("加密完成!\n"); } void decrypt(int a1,int b){ int counter=0; char c; FILE *plainfptr,*cipherfptr; if((cipherfptr=fopen("12.txt","r"))==NULL|| (plainfptr=fopen("13.txt","w"))==NULL) printf("ERROR!"); else{ while((c=fgetc(cipherfptr))!=EOF){ c=(a1*(c-'A'+26-b))%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("11.txt","r"); tag=1; break; case 2: fptr=fopen("12.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); }