维吉尼亚密码C语言实现.docx
- 文档编号:30194840
- 上传时间:2023-08-07
- 格式:DOCX
- 页数:11
- 大小:61.79KB
维吉尼亚密码C语言实现.docx
《维吉尼亚密码C语言实现.docx》由会员分享,可在线阅读,更多相关《维吉尼亚密码C语言实现.docx(11页珍藏版)》请在冰豆网上搜索。
维吉尼亚密码C语言实现
2016春密码学原理软件学院
密码学原理作业报告
作业1:
古典密码体制的实践与分析
姓名
查志华
院系
软件学院
学号
1133710313
任课教师
刘绍辉
指导教师
刘绍辉
实验地点
哈尔滨工业大学
实验时间
2016.3.15-2016.3.18
一、实验目的
要求:
综述本次实验的基本目的。
1.了解古典密码的基本体制,掌握维吉尼亚密码的加解密方式,能对文件进行加解密。
2.掌握重合指数的计算方法,了解掌握Kasiski’s的计算方法,能对明文以及密文进行重合指数的计算以及Kasiski’s计算方法;
二、实验内容
要求:
对如下内容进行详细描述。
1.弗吉尼亚密码加密解密算法;
明文=(密文-密钥+26)/26;
密文=(明文+密钥)/26;
具体实现见下代码。
2.重合指数计算算法;
先统计出各个字母出现的频数,f(a),f(b),……,f(z)
f(a)+f(b)+……+f(z)=X(X就是密文长度),然后把所有的f(字母)*(f(字母)-1)的和求出来,假设为sum,sum/(X*(X-1))就是重合指数
具体实现见下代码。
3.Kasiski’s计算方法;
1 在密文中标出重复的三个或多个字符结构;
2 对每一个字符结构,记下结构的起始位置;
3 计算相邻的起始点的距离;
4 对每个距离求出所有因数;
5 若使用多字母替换密码,则密钥的长度为步骤4种出现的某一因数;
三、实验结果及分析
要求:
将实验获得的结果进行描述,涉及不同的密钥以及密钥长度,不同密文长度情况下的Kasiski分析及重合指数分析得出的结果。
选择文件进行操作,对于不同的密钥以及不同长度的密钥,情况如下:
(文件选取为英文原著阿兹卡班的囚徒1.txt,大小为21K)
各字符频率统计:
●密钥长度为4时,即n=4时:
●密钥长度为16时,即n=16时:
重合指数计算:
●n=1时:
●n=2时:
●n=4时:
●n=8时:
●n=16时:
●n=32时:
●n=64时:
●n=128时:
●n=256时:
●n=9000时:
结论:
当密钥的长度足够大时,发现密文的重合指数会趋向于3.84%,也就是1/26。
代码如下:
#include
#include
#include
#include
#include
voidGenkey(intlen);
voidDenKey();
intmain()
{
intlen=0;
intselect=0;
while
(1)
{
printf("请选择操作:
加密
(1);解密
(2):
退出(3)\n");
scanf("%d",&select);
if(select==1)//加密操作
{
printf("请输入密钥长度\n");
scanf("%d",&len);
Genkey(len);
}
elseif(select==2)//解密操作
{
DenKey();
}
elseif(select==3)
{
exit(0);
}
else
{
printf("输入有误!
\n");
}
}
return0;
}
voidGenkey(intlen)
{
srand((unsigned)time(NULL));//用时间做种,每次产生随机数不一样
intnumber=0,i=0,j=0,len1;
len1=len;
charch;
charkey1[10000]="";
charalp[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)//随机生成密钥
{
number=rand()%26;//产生0-25的随机数
key1[i]=alp[number];
len--;
i++;
}
printf("随机生成的密钥为:
");
while(len1>0)//打印密钥
{
printf("%c",key1[j]);
j++;
len1--;
}
printf("\n");
intL=strlen(key1);
FILE*fp,*fp1;
intnum1[26];
intnum2[26];
intm=0;
for(m=0;m<26;m++)
{
num1[m]=0;
num2[m]=0;
}
intal=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("加密结果请查看文档!
\n");
//printf("%d\n",j);
fclose(fp1);
fclose(fp);
//统计明文密文中各字符的频率
printf("明文中各字符的频率(a-z):
");
for(m=0;m<26;m++)
{
printf("%.3f%%",(float)num1[m]/j*100);
if((m%5)==0)
{
printf("\n");
}
}
printf("密文中各字符出现的频率(a-z):
");
for(m=0;m<26;m++)
{
printf("%.3f%%",(float)num2[m]/j*100);
if((m%5)==0)
{
printf("\n");
}
}
//计算重合指数
intsum=0;
intsum1=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("密钥长度为%d时\n",L);
printf("明文的重合指数为:
%.3f%%\n",(float)sum/(j*(j-1))*100);
printf("密文的重合指数为:
%.3f%%\n",(float)sum1/(j*(j-1))*100);
}
voidDenKey()
{
charkey[10000];
charch,temp;
intL,j=0;
if(getchar()=='\n')
temp='';
printf("请输入密钥(小写字母):
");
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++;
}
elseif(ch>='a'&&ch<='z')
{
fprintf(fp1,"%c",(ch-key[j%L]-'a'+'a'+26)%26+'A');
j++;
}
fscanf(fp,"%c",&ch);
}
printf("解密结果请查看文档!
\n");
fclose(fp1);
fclose(fp);
}
}
四、实验成绩(共5分)
程序设计成绩(1分)
实验结果成绩(2分)
实验报告成绩(2分)
总成绩
指导教师签字
日期
WelcomeTo
Download!
!
!
欢迎您的下载,资料仅供参考!
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 维吉尼亚 密码 语言 实现