维吉尼亚c语言编码原理,维吉尼亚密码的C语言实现.doc
#include void Genkey(int len);
void DenKey();
int main()
{
int len = 0;
int select =0;
while(1)
{
printf("請(qǐng)選擇操作:加密(1);解密(2):退出(3)\n");
scanf("%d",&select);
if(select ==1)//加密操作
{
printf("請(qǐng)輸入密鑰長(zhǎng)度\n");
scanf("%d",&len);
Genkey(len);
}
else if(select ==2)//解密操作
{
DenKey();
}
else if(select ==3)
{
exit(0);
}
else
{
printf("輸入有誤!\n");
}
}
return 0;
}
void Genkey(int len)
{
srand((unsigned) time(NULL)); //用時(shí)間做種,每次產(chǎn)生隨機(jī)數(shù)不一樣
int number=0,i=0,j=0,len1;
len1=len;
char ch;
char key1[10000]= "";
char alp[26] = {'A','B','C','D','E','F','G',
'H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'
};
while(len >0)//隨機(jī)生成密鑰
{
number= rand() % 26; //產(chǎn)生0-25的隨機(jī)數(shù)
key1[i] = alp[number];
len --;
i++;
}
printf("隨機(jī)生成的密鑰為:");
while(len1>0)//打印密鑰
{
printf("%c",key1[j]);
j++;
len1--;
}
printf("\n");
int L=strlen(key1);
FILE *fp,*fp1;
int num1[26];
int num2[26];
int m=0;
for(m=0; m<26; m++)
{
num1[m]=0;
num2[m]=0;
}
int al=0,bl=0;
fp=fopen("G:\\1.txt","r");
fp1=fopen("G:\\2.txt","w");
if(fp == NULL)
{
printf("文件打開失敗!");
}
i=0,j=0;
fscanf(fp,"%c",&ch);
while(!feof(fp))
{
if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z'))
{
if(ch>='A'&&ch<='Z')
{
al=(int)(ch-'A');
num1[al]++;
fprintf(fp1,"%c",(ch+key1[j%L]-'A'-'A')%26+'A');
bl=(int)((ch+key1[j%L]-'A'-'A')%26);
num2[bl]++;
j++;
}
else
{
al=(int)(ch-'a');
num1[al]++;
fprintf(fp1,"%c",(ch+key1[j%L]-'A'-'a')%26+'A');
bl=(int)((ch+key1[j%L]-'A'-'a')%26);
//printf("%d ",bl);
num2[bl]++;
j++;
}
}
fscanf(fp,"%c",&ch);
}
printf("加密結(jié)果請(qǐng)查看文檔!\n");
// printf("%d\n",j);
fclose(fp1);
fclose(fp);
//統(tǒng)計(jì)明文密文中各字符的頻率
printf("明文中各字符的頻率(a-z):");
for(m=0; m<26; m++)
{
printf("%.3f%% ",(float)num1[m]/j*100);
if((m%5)==0)
{
printf("\n");
}
}
printf("密文中各字符出現(xiàn)的頻率(a-z):");
for(m=0; m<26; m++)
{
printf("%.3f%% ",(float)num2[m]/j*100);
if((m%5)==0)
{
printf("\n");
}
}
//計(jì)算重合指數(shù)
int sum =0;
int sum1=0;
for(m=0; m<26; m++)
{
sum=sum+num1[m]*(num1[m]-1);
}
for(m=0; m<26; m++)
{
sum1=sum1+num2[m]*(num2[m]-1);
}
printf("密鑰長(zhǎng)度為%d時(shí)\n",L);
printf("明文的重合指數(shù)為:%.3f%%\n",(float)sum/(j*(j-1))*100);
printf("密文的重合指數(shù)為:%.3f%%\n",(float)sum1/(j*(j-1))*100);
}
void DenKey()
{
char key[10000];
char ch,temp;
int L,j=0;
if(getchar()=='\n')
temp=' ';
printf("請(qǐng)輸入密鑰(小寫字母): ");
gets(key);
L=strlen(key);
FILE *fp,*fp1;
fp=fopen("G:\\2.txt","r");
fp1=fopen("G:\\3.txt","w");
if(fp == NULL)
{
printf("文件打開失敗!");
}
else
{
fscanf(fp,"%c",&ch);
while(!feof(fp))
{
if(ch>='A'&&ch<='Z')
{
fprintf(fp1,"%c",(ch-key[j%L]-'A'+'a'+26)%26+'A');
j++;
}
else if(ch>='a'&&ch<='z')
{
fprintf(fp1,"%c",(ch-key[j%L]-'a'+'a'+26)%26+'A');
j++;
}
fscanf(fp,"%c",&ch);
}
printf("解密結(jié)果請(qǐng)查看文檔!\n");
fclose(fp1);
fclose(fp);
}
}
四、實(shí)驗(yàn)成績(jī)(共5分)
程序設(shè)計(jì)成績(jī)(1分)
實(shí)驗(yàn)結(jié)果成績(jī)(2分)
實(shí)驗(yàn)報(bào)告成績(jī)(2分)
總成績(jī)
指導(dǎo)教師簽字
日期
與50位技術(shù)專家面對(duì)面20年技術(shù)見證,附贈(zèng)技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的维吉尼亚c语言编码原理,维吉尼亚密码的C语言实现.doc的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c语言设计期末考试试题及答案,C语言程序
- 下一篇: c语言垂直制表的作用,c语言中“\”的用