www.pudn.com > cryptology.rar > hill.cpp
#includevoid encrypt2(void); void decrypt2(void); void encrypt3(void); void decrypt3(void); void frequency(void); void main(){ encrypt2(); decrypt2(); encrypt3(); decrypt3(); frequency(); } void encrypt2(void){ char c; int i=0,j=0,counter=0; int metrix[2][2]={{11,8},{3,7}}; int *temp,*result; temp=new int[2]; result=new int[2]; for(i=0;i<=1;i++) result[i]=0; FILE * hill21fptr,*hill22fptr; if((hill21fptr=fopen("31.txt","r"))==NULL||(hill22fptr=fopen("32.txt","w"))==NULL) printf("ERROR\n"); else{ for(i=0;i<=1;i++){ c=fgetc(hill21fptr); if(c==EOF) break; else{ temp[i]=c-'a'; counter++; if(counter%2==0){ for(i=0;i<=1;i++) for(j=0;j<=1;j++) result[i]+=temp[j]*metrix[j][i]; for(i=0;i<=1;i++) fputc(result[i]%26+'A',hill22fptr); for(i=0;i<=1;i++) result[i]=0; i=-1; } } } } fclose(hill21fptr); fclose(hill22fptr); } void decrypt2(void){ char c; int i=0,j=0,counter=0; int metrix[2][2]={{7,18},{23,11}}; int *temp,*result; temp=new int[2]; result=new int[2]; for(i=0;i<=1;i++) result[i]=0; FILE * hill22fptr,*hill23fptr; if((hill22fptr=fopen("32.txt","r"))==NULL||(hill23fptr=fopen("33.txt","w"))==NULL) printf("ERROR\n"); else{ for(i=0;i<=1;i++){ c=fgetc(hill22fptr); if(c==EOF) break; else{ temp[i]=c-'A'; counter++; if(counter%2==0){ for(i=0;i<=1;i++) for(j=0;j<=1;j++) result[i]+=temp[j]*metrix[j][i]; for(i=0;i<=1;i++) fputc(result[i]%26+'a',hill23fptr); for(i=0;i<=1;i++) result[i]=0; i=-1; } } } } fclose(hill22fptr); fclose(hill23fptr); } void encrypt3(void){ char c; int i=0,j=0,counter=0; int metrix[3][3]={{10,5,12},{3,14,21},{8,9,11}}; int *temp,*result; temp=new int[3]; result=new int[3]; for(i=0;i<=2;i++) result[i]=0; FILE * hill34fptr,*hill35fptr; if((hill34fptr=fopen("34.txt","r"))==NULL||(hill35fptr=fopen("35.txt","w"))==NULL) printf("ERROR\n"); else{ for(i=0;i<=2;i++){ c=fgetc(hill34fptr); if(c==EOF) break; else{ temp[i]=c-'a'; counter++; if(counter%3==0){ for(i=0;i<=2;i++) for(j=0;j<=2;j++) result[i]+=(temp[j]*metrix[j][i]); for(i=0;i<=2;i++) fputc(result[i]%26+'A',hill35fptr); for(i=0;i<=2;i++) result[i]=0; i=-1; } } } } fclose(hill34fptr); fclose(hill35fptr); } void decrypt3(void){ char c; int i=0,j=0,counter=0; int metrix[3][3]={{21,15,17},{23,2,16},{25,4,3}}; int *temp,*result; temp=new int[3]; result=new int[3]; for(i=0;i<=2;i++) result[i]=0; FILE * hill35fptr,*hill36fptr; if((hill35fptr=fopen("35.txt","r"))==NULL||(hill36fptr=fopen("36.txt","w"))==NULL) printf("ERROR\n"); else{ for(i=0;i<=2;i++){ c=fgetc(hill35fptr); if(c==EOF) break; else{ temp[i]=c-'A'; counter++; if(counter%3==0){ for(i=0;i<=2;i++) for(j=0;j<=2;j++) result[i]+=(temp[j]*metrix[j][i]); for(i=0;i<=2;i++) fputc(result[i]%26+'a',hill36fptr); for(i=0;i<=2;i++) result[i]=0; i=-1; } } } } fclose(hill35fptr); fclose(hill36fptr); } 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("34.txt","r"); tag=1; break; case 2: fptr=fopen("35.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); for(i=0;i<=25;i++){ putchar(i+'a'); printf(": %f\n",(float)counter[i]/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++){ putchar(i+'A'); printf(": %f\n",(float)counter[i]/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); }