📄 affine.cpp
字号:
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
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);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -