实验2-移位密码分析实验一、实验内容通过编程实现使用频度分析法破解凯撒密码的程序。并通过下面两段密文解密验证。已知,拦截到下列两段密文,使用的是移位密码,利用频度攻击分别找出其明文:1、XLILSYWIMWRSAJSVWEPIJSVJSYVQMPPMSRHSPPEVWMXMWASVXLQSVILYVVCFIJSVIXLIWIPPIVVIGIMZIWQSVISJJIVW2、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、程序设计流程说明,提交源代码及详细注释源代码:#includestdio.h#includestdlib.h#includestring.hintcount[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);开始输入要打开的文件名计算文件中各个字母出现的次数输入出现次数最多的字母计算出密钥解密出明文结束elseprintf(成功打开文件\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']++;elsecount[s[i]-'a'];}}for(i=0;i26;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;im;i++)/*进行解密*/{n=(int)(s[i]);if(n64&&n91){n=(n-65-k)%26;if(n0)n=26+n;l=(char)(n+97);printf(%c,l);}}s[i]='\0';return0;}3、用截图描述实验过程和结果4、提示:可将密文保存为文件,对该密文文件进行破解可假设该文件中只有26个英文字母;或者考虑文件里包含标准ASCII码表中的128个任意字符