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

📄 affine.cpp

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