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

📄 vigenere.cpp

📁 实现了三种古典密码学体制和DES体制及其分析。affine(仿射)读入文件11.txt中内容(小写字母
💻 CPP
字号:
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void encrypt(int *,int );
void decrypt(int *,int );
void frequency(void);

void main(){
	int i=0,n=0,*key;
	
	printf("输入密钥字长度:\n");
	scanf("%d",&n);
	srand(time(NULL));
	key=new int[n];
	for(i=0;i<=n-1;i++){
		*(key+i)=rand()%26;
	}
	printf("密钥生成结果:");
	for(i=0;i<=n-1;i++)
		printf("%d ",*(key+i));
	putchar('\n');
	
	int choice=-1;
	printf("主菜单:输入1加密,输入2解密,输入3统计频率,输入-1退出\n");
	scanf("%d",&choice);
	while(choice!=-1){
		switch(choice){
			case 1:
				encrypt(key,n);
				break;
			case 2:
				decrypt(key,n);
				break;
			case 3:
				frequency();
		}
		scanf("%d",&choice);
	}
}

void encrypt(int *key,int n){
	int counter=0;
	char c;
	FILE *plainfptr,*cipherfptr;
	if((plainfptr=fopen("21.txt","r"))==NULL||
		(cipherfptr=fopen("22.txt","w"))==NULL)
		printf("ERROR!");
	else{
		while((c=fgetc(plainfptr))!=EOF){
			c=(c-'a'+key[counter%n])%26+'A';
			counter++;
			fputc(c,cipherfptr);
		}
	}
	fclose(plainfptr);
	fclose(cipherfptr);
	printf("加密完成!\n");
}

void decrypt(int *key,int n){
	int counter=0;
	char c;
	FILE *plainfptr,*cipherfptr;
	if((cipherfptr=fopen("22.txt","r"))==NULL||
		(plainfptr=fopen("23.txt","w"))==NULL)
		printf("ERROR!");
	else{
		while((c=fgetc(cipherfptr))!=EOF){
			c=(c-'A'+26-key[counter%n])%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("21.txt","r");
			tag=1;
			break;
		case 2:
			fptr=fopen("22.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 + -