⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hill.cpp

📁 实现了三种古典密码学体制和DES体制及其分析。affine(仿射)读入文件11.txt中内容(小写字母
💻 CPP
字号:
#include<stdio.h>
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);
}
	

	


		
			



⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -