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); 
}