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


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