实验2移位密码分析实验.doc
《实验2移位密码分析实验.doc》由会员分享,可在线阅读,更多相关《实验2移位密码分析实验.doc(5页珍藏版)》请在冰点文库上搜索。
实验2-移位密码分析实验
一、实验内容
通过编程实现使用频度分析法破解凯撒密码的程序。
并通过下面两段密文解密验证。
已知,拦截到下列两段密文,使用的是移位密码,利用频度攻击分别找出其明文:
1、XLILSYWIMWRSAJSVWEPIJSVJSYVQMPPMSRHSPPEVWMXMWASVXLQSVILYVVCFIJSVIXLIWIPPIVVIGIMZIWQSVISJJIVW
2、XULTPAAJCXITLTLXAARPJHTIWTGXKTGHIDHIPXCIWTVGTPILPITGHLXIWIWTXGQADDS
二、实验要求
1、写出凯撒密码的频度分析原理
一篇包含字符的英文文章,其各ASCII码字符出现,都有一定的频率,出现较高频率的两个字符是''(空格)和'e',而且它们的ASCII码分别是32和101,差值是69。
既然凯撒密码利用的是单表替换的一种简单加密算法,所以,我们的主角,''和'e',在解密后,依然会保持相同的ASCII码差值,69。
|c1-c2|=|'e'-''|=|101-32|=69
|m1-m2|=|((c1+k)mod256)-((c2+k)mod256)|=|c1-c2|=|'e'-''|=69
现在可以得到破解凯撒密码的原理了,我们统计一片经过凯撒加密的密文字符信息,在出现频率较高的字符里面寻找差值是69的2个字符,这两个必定是''和'e'字符的加密字符,计算偏移量(既密钥key),通过解密运算,还原出明文。
2、程序设计流程说明,提交源代码及详细注释
开始
输入要打开的文件名
计算文件中各个字母出现的次数
输入出现次数最多的字母
计算出密钥
解密出明文
结束
源代码:
#include
#include
#include
intcount[27];
chars[100];
intmain()
{
inti,n,m,l,k;
FILE*fp;
chard;
charfilename[100];
printf("请输入要打开的文件名:
\n");//输入要打开的文件名
gets(filename);
fp=fopen("filename","r");
if((fp=fopen(filename,"r"))==NULL)//打开文件,并判断是否有打开错误
printf("打开文件%s出现错误\n",filename);
else
printf("成功打开文件\n");
while(fgets(s,100,fp))//计算文件中每个英文字母出现的次数
{
for(i=0;s[i];i++)
{
if(s[i]<'A'||s[i]>'z'||(s[i]>'Z'&&s[i]<'a'))
count[26]++;
elseif(s[i]<'a')
count[s[i]-'A']++;
else
count[s[i]-'a'];
}
}
for(i=0;i<26;i++)
{
printf("%cor%c:
%d次\n",'A'+i,'a'+i,count[i]);
}
printf("其它字符:
%d次\n",count[26]);
printf("inputthenumber\n");//输入出现次数最多的字母
scanf("%c",&d);
k=(int)(d-'e');//计算出密钥
printf("thekeyis:
%d\n",k);
printf("Whentheciphertextis'%s',\nThepasswordprogramis...:
:
\n\n",s);
m=strlen(s);
for(i=0;i{
n=(int)(s[i]);
if(n>64&&n<91)
{
n=(n-65-k)%26;
if(n<0)
n=26+n;
l=(char)(n+97);
printf("%c",l);
}
}
s[i]='\0';
return0;
}
3、用截图描述实验过程和结果
4、提示:
可将密文保存为文件,对该密文文件进行破解
可假设该文件中只有26个英文字母;或者考虑文件里包含标准ASCII码表中的128个任意字符