www.pudn.com > cryptology.rar > hill.cpp


#include 
void 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); 
}