信息安全古典密码之凯撒密码
- 格式:docx
- 大小:258.87 KB
- 文档页数:13
凯撒密码的原理及应用一、凯撒密码的原理凯撒密码是一种简单的替换密码,也是最古老的加密算法之一。
它以罗马帝国的凯撒大帝命名,是为了保护军事通信的安全而设计的。
凯撒密码的原理很简单,它通过将明文中的每个字母按照字母表向后(或向前)移动固定的位置来进行加密。
移动的位数称为移位量或密钥。
举例来说,如果移位量为3,那么明文中的每个字母都会向后移动3个位置:A变成D,B变成E,依此类推。
换句话说,凯撒密码是通过字母表的循环移位来实现加密的。
凯撒密码的加密过程可以用以下公式表示: - 密文 = (明文 + 移位量) mod 26解密过程则是将移位量取反即可: - 明文 = (密文 - 移位量) mod 26二、凯撒密码的应用凯撒密码的简单原理使其应用场景非常广泛。
以下是凯撒密码的几个应用领域:1. 军事通信凯撒密码最初是为了保护军事通信的安全而设计的。
在古代,将军们使用凯撒密码来加密军事指令和情报,以防止敌方截获并识别其内容。
即使敌方获得了密文,也需要知道密钥才能解密。
2. 个人隐私保护凯撒密码虽然简单,但在某些情况下仍可用于个人隐私保护。
例如,人们可以使用凯撒密码对一些私人信息进行加密,比如存储在电脑中的文件、笔记等。
只有知道密钥的人才能解密这些信息。
3. 学术研究凯撒密码在密码学的学术研究中也有一席之地。
虽然凯撒密码不适用于现代密码学领域的高强度加密需求,但它可以用作讲解和教学密码学相关概念的案例。
4. 密码学竞赛凯撒密码还被用于密码学竞赛中的加密挑战。
这些竞赛中的选手需要解密使用凯撒密码加密的密文,以获取隐藏在其中的信息或进入下一关。
三、凯撒密码的安全性尽管凯撒密码在历史中有重要的地位,但其安全性非常低。
由于凯撒密码只有26种可能的密钥(即移位量),使用穷举搜索算法可以很快地破解该密码。
更进一步,若敌方获得了一段未知密文,可以通过统计英文字母在文本中的频率来猜测可能的密钥。
因为英文中的字母有着特定的出现频率,使用频率分析可以帮助敌方找到正确密钥的可能性。
古典密码-凯撒密码Caeser凯撒密码Caeser Cipher在早期,凯撒密码(Caeser Cipher)是指将密⽂平移三位,后来经过推⼴,平移个数扩展为任意位,即移位密码(Shift Cipher)原理凯撒密码(Caesar)加密时会将明⽂中的每个字母都按照其在字母表中的顺序向后(或向前)移动固定数⽬(循环移动)作为密⽂。
例如,当偏移量是左移 3 的时候(解密时的密钥就是 3):明⽂字母表:ABCDEFGHIJKLMNOPQRSTUVWXYZ密⽂字母表:DEFGHIJKLMNOPQRSTUVWXYZABC使⽤时,加密者查找明⽂字母表中需要加密的消息中的每⼀个字母所在位置,并且写下密⽂字母表中对应的字母。
需要解密的⼈则根据事先已知的密钥反过来操作,得到原来的明⽂。
例如:明⽂:THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG密⽂:WKH TXLFN EURZQ IRA MXPSV RYHU WKH ODCB GRJ特定名称根据偏移量的不同,还存在若⼲特定的恺撒密码名称:偏移量为 10:Avocat (A→K)偏移量为 13:偏移量为 -5:Cassis (K 6)偏移量为 -6:Cassette (K 7)此外,还有还有⼀种基于密钥的凯撒密码 Keyed Caesar。
其基本原理是利⽤⼀个密钥,将密钥的每⼀位转换为数字(⼀般转化为字母表对应顺序的数字),分别以这⼀数字为密钥加密明⽂的每⼀位字母,例如:密⽂:s0a6u3u1s0bv1a密钥:guangtou偏移:6,20,0,13,6,19,14,20明⽂:y0u6u3h1y0uj1u解密⼯具在线⽹站:该⽹站可以在线对凯撒进⾏25中移位的破解,并直接返回结果⼯具:CaptfEncoder⾥⾯集成了⼀堆各式各样的⼯具,其中就包含Caeser Cipher的解密。
古典密码汇总
古典密码是指在计算机技术出现之前使用的一种数据加密方式。
以下是一些常见的古典密码:
1. 凯撒密码:将明文中的每个字母按照字母表顺序向后移动固定的位置来生成密文。
2. 维吉尼亚密码:通过使用不同的密钥按字母表顺序对明文逐字母进行移位加密。
3. 单换密码:根据某种规则将明文中的每个字母替换为另一个字母来生成密文。
4. 多换密码:类似于单换密码,但使用多个替换规则来加密明文。
5. 栅栏密码:将明文按照一定长度分成多行,然后按行输出密文。
6. 简单替换密码:将明文中的每个字母替换为另一个字母或符号来生成密文。
7. 维因纳尔方阵密码:使用一个方阵将明文中的字母映射为密文中的其他字母。
8. 培根密码:将明文中的每个字母映射为5个二进制位,然后用A和B表示。
这只是一小部分古典密码,还有许多其他类型的古典密码存在。
由于古典密码的安全性相对较低,现代密码学已经发展出了更加复杂和安全的加密算法。
古典密码简介
古典密码是一种在早期历史上用于安全通信的技术,其中包括凯撒密码、培根密码、摩斯密码、栅栏密码、维吉尼亚密码、猪圈密码和偏移量密码这些密码在CTF比赛中经常出现。
这些加密技术通常用于保护通信不被第三方或敌人破解,并确保信息的机密性。
古典密码的主要特点是使用替换或替换+换位的方式,替换密码使用替换表,单表和多表都有,换位密码则根据一定的规则重新排列明文。
由于其简单的设计,它是历史上最广泛使用的加密技术。
其中,凯撒密码可以通过偏移量来加密和解密,培根密码加密后只有a和b,摩斯密码是时通时断的信号代码,栅栏密码是将明文分成N个一组加密,维吉尼亚密码是使用凯撒密码进行加密的算法,猪圈密码是一种以格子为基础的简单替代密码,偏移量密码是一种仿射密码。
古典密码的另一个关键方面是其安全性在于保持算法本身的保密性,因此即使发送者和接收者知道加密的方式,但除非知道密钥,否则很难破解古典密码。
然而,由于替换和换位的方式很容易被敌方破解,所以随着技术的不断发展和进步,古典密码被现代密码算法所替代,成为安全性更高的加密技术。
古典密码运用的两种基本技术古典密码是指使用传统的加密算法和技术进行加密和解密通信信息的密码系统。
它是密码学的起源,直到20世纪的中期被现代密码系统所取代。
古典密码运用了许多不同的加密技术,但其中有两种是最基本和常见的,分别是置换技术和替换技术。
1.置换技术置换技术是一种古老而普遍的加密方法,它通过改变字母或字符的顺序来加密原始文本。
常见的置换技术有以下几种:a. 凯撒密码(Caesar Cipher):凯撒密码是一种基本的字母置换密码,它通过对字母表进行循环左移或右移来加密和解密文本。
在凯撒密码中,每个字母都被替换为字母表中固定位置的字母,这个固定位置由一个偏移量决定。
b. 列置换密码(Columnar Transposition Cipher):列置换密码将明文分成若干列,然后按照一定的顺序将这些列重新排列,形成密文。
解密时,按照相同的顺序将密文的列排列,并按列逐个读取即可恢复原始文本。
c. 群置换密码(Permutation Cipher):群置换密码将明文中的字母分成若干个群,然后按照一定的顺序对这些群进行重新排列,形成密文。
解密时,按照相同的顺序将密文的群排列,并按群逐个读取即可恢复原始文本。
2.替换技术替换技术是古典密码学中另一种常见的加密技术,它通过将明文中的字母替换为其他字母或符号来加密文本。
a.单字母替换密码:单字母替换密码使用一个简单的替换表来将明文字母一对一地替换为其他字母或符号。
替换表可以是任何形式的映射,如字母表的逆置、移位替换等。
单字母替换密码易于破解,因为它们可以通过使用频率分析方法推断出英文字母的出现频率。
b. 多字母替换密码:多字母替换密码使用多个字母或字符的替换规则来加密文本。
常见的多字母替换密码包括维吉尼亚密码(Vigenère Cipher)和同音词替换密码(Homophonic Substitution Cipher)。
多字母替换密码相对于单字母替换密码更加安全,因为它们改变了字母的频率,并增加了破解的难度。
古代加密方式
古代的加密方式有很多种,以下列举几种比较常见的方式:
1. 凯撒密码:又称移位密码,是一种最早出现的加密方式。
其原理是将明文中的每个字母按照一定的偏移量进行替换,达到隐藏信息的目的。
例如,将每个字母向后移动三位,A就变成了D,B变成了E,以此类推。
2. 简易替换密码:也称为单字母替换密码,是一种通过将明文字母替换为其他字母来加密的方式。
例如,将明文中的每个字母替换为字母表中的另一个字母,形成密文。
由于规则简单,被认为是一种相对较弱的加密方式。
3. 维吉尼亚密码:是一种基于多个凯撒密码的组合加密方式。
它引入了密钥的概念,密钥决定了每个字母的偏移量。
通过使用不同的密钥,可以生成不同的凯撒密码,增加了加密的复杂度。
4. 图形密码:在古代,人们还使用了图形作为密码的一种方式。
例如,在埃及墓穴中发现的壁画中,人们使用了各种符号和图案作为密码来保护珍贵的物品和信息。
需要注意的是,古代的加密方式相对简单,随着科技的发展,加密算法变得更加复杂和安全。
现代的加密方式采用了更强大的数学算法和计算机技术,能够提供更高的安全性和保密性。
《网络攻击与防御》实验报告计算机科学与技术学院计算机系网络教研室制一、实验目的(1)编程实现凯撒加密、解密算法,理解密码学基础知识,初步建立密码学思维方式。
(2)通过不断增加凯撒解密难度,理解唯密文解密,提高解密性能。
二、实验环境操作系统:Windows 10操作系统软件工具:C++语言编译环境三、实验内容与实验要求(1)在允许输入密码条件下,编程实现凯撒密码加解密解密。
要求:①从一文本文件读入英文文章(明文或密文)。
②对读入内容加密或解密后写入另一文本文件。
(2)在不允许输入密码条件下,编程实现解密凯撒密码加密密文。
要求绘制三种情况下解密程序流程图,说明不同解密程序存在的不足。
程序需要计算、显示解密使用时间(单位:ms)。
①已知c1 =wklv lv d errn,求p1。
(初级解密)问:两次使用凯撒,能否正确解密?(字符串用凯撒加密后的结果再用凯撒加密一次。
)②已知c1 =go kbo cdenoxdc,或c1 =zh duh vwxghqwv,求p1。
(中级解密)③已知c1 =rxwvlgh wkh eleoh, wkhvh vla zrugv duh wkh prvw idprxv lq doo wkh olwhudwxuh ri wkh zruog. wkhb zhuh vsrnhq eb kdpohw zkhq kh zdv wklqnlqj dorxg, dqg wkhb duh wkh prvw idprxv zrugv lq vkdnhvshduh ehfdxvh kdpohw zdv vshdnlqj qrw rqob iru klpvhoi exw dovr iru hyhub wklqnlqj pdq dqg zrpdq. wr eh ru qrw wr eh, wr olyh ru qrw wr olyh, wr olyh ulfkob dqg dexqgdqwob dqg hdjhuob, ru wr olyh gxoob dqg phdqob dqg vfdufhob. d sklorvrskhu rqfh zdqwhg wr nqrz zkhwkhu kh zdv dolyh ru qrw, zklfk lv d jrrg txhvwlrq iru hyhubrqh wr sxw wr klpvhoi rffdvlrqdoob. kh dqvzhuhg lw eb vdblqj: "l wklqn, wkhuhiruh dp." ,求p1。
古典密码的实验报告1. 引言古典密码是一种古老的加密技术,用于在信息传递过程中保护敏感信息的安全性。
它通过将明文转换成密文,从而使未经授权的个体无法理解信息的内容。
本实验旨在介绍几种常见的古典密码算法,并通过实验验证其加密和解密的过程。
2. 凯撒密码凯撒密码是最简单的古典密码之一,它通过将明文中的每个字母向前或向后移动固定的位置来加密信息。
例如,当移动的位置为3时,明文中的字母A将被替换为D,字母B将被替换为E,以此类推。
2.1 加密过程1.输入明文。
2.设置移动的位置。
3.对于明文中的每个字母,按照移动的位置将其替换为对应的字母。
4.得到密文。
2.2 解密过程1.输入密文。
2.设置移动的位置。
3.对于密文中的每个字母,按照移动的位置将其替换为对应的字母。
4.得到明文。
3. 维吉尼亚密码维吉尼亚密码是一种多表密码,它通过使用一系列凯撒密码表来加密信息。
每个表中的移动位置逐个递增,这样可以更好地混淆明文的结构。
3.1 加密过程1.输入明文。
2.输入密钥。
3.对于明文中的每个字母,找到对应的凯撒密码表。
4.根据对应的表和密钥,将明文中的字母替换为密文。
5.得到密文。
3.2 解密过程1.输入密文。
2.输入密钥。
3.对于密文中的每个字母,找到对应的凯撒密码表。
4.根据对应的表和密钥,将密文中的字母替换为明文。
5.得到明文。
4. 培根密码培根密码是古典密码中的另一种类型,它使用一系列相同长度的字母组成的密钥来加密信息。
明文中的每个字母都将被替换为对应密钥中的字母。
4.1 加密过程1.输入明文。
2.输入密钥。
3.对于明文中的每个字母,将其对应到密钥中的相应字母。
4.得到密文。
4.2 解密过程1.输入密文。
2.输入密钥。
3.对于密文中的每个字母,将其对应到密钥中的相应字母。
4.得到明文。
5. 实验结果与讨论在本实验中,我们使用了凯撒密码、维吉尼亚密码和培根密码进行加密和解密实验。
通过对不同算法的测试,我们发现:1.凯撒密码是最简单的古典密码之一,但由于移动位置的确定性,易受到频率分析等攻击方式的威胁。
计科一班刘亮学号:2009221104210051实验一:凯撒密码一:实验目的理解和掌握凯撒密码的原理,可以简单解密。
二、实验原理凯撒密码作为一种最为古老的对称加密体制,在古罗马的时候都已经很流行,他的基本思想是:通过把字母移动一定的位数来实现加密和解密。
例如,如果密匙是把明文字母的位数向后移动三位,那么明文字母B就变成了密文的E,依次类推,X将变成A,Y变成B,Z变成C,由此可见,位数就是凯撒密码加密和解密的密钥。
它是一种代换密码。
据说恺撒是率先使用加密函的古代将领之一,因此这种加密方法被称为恺撒密码。
实验原理:将明文中的每个字母用引字符在字母表中后面第k个字母替代。
它的加密过程可以表示为下面函数:E(m)=(m+k) mod n其中,m为明文字母在字母表中的位置数;n为字母表中的字母个数;k为密钥;E(m)为密文字母在字母表中对应的位置数。
同理可得解密过程。
实验内容:根据实验原理,自己创建明文信息,并选择一个密钥,编写循环移位密码算法的实现程序,实现加密和解密操作。
要求上述密码算法最后的实现程序提供加密和解密两个接口:int encrypt() 和int decrypt()。
当加密或者解密成功时返回CRYPT_OK, 失败时返回CRYPT_ERROR。
所谓的“恺撒密码”,它是一种替代密码,通过将字母按顺序推后起3位起到加密作用,如将字母A换作字母D,将字母B换作字母E。
因据说恺撒是率先使用加密函的古代将领之一,因此这种加密方法被称为恺撒密码。
这是一种简单的加密方法,这种密码的密度是很低的,只需简单地统计字频就可以破译。
现今又叫“移位密码”,只不过移动的为数不一定是3位而已。
三、实验步骤密码术可以大致别分为两种,即易位和替换,当然也有两者结合的更复杂的方法。
在易位中字母不变,位置改变;替换中字母改变,位置不变。
尽管苏托尼厄斯仅提到三个位置的恺撒移位,但显然从1到25个位置的移位我们都可以使用,因此,为了使密码有更高的安全性,单字母替换密码就出现了。
古典密码的加密方法
古典密码是指在密码学中较早出现和较简单的加密方法,主要包括凯撒密码、凯恩密码、维吉尼亚密码等。
1. 凯撒密码:由罗马帝国大军领袖凯撒所使用的密码。
加密时,将明文中的每个字母向后移动固定的位置。
例如,将明文中的每个字母向后移动三位。
解密时,将密文中的每个字母向前移动三位。
2. 凯恩密码:由大英帝国舰队司令官查尔斯·凯恩所使用的密码。
加密时,将明文中的每个字母移动一个随机位置。
解密时,将密文中的每个字母移动一个相反的位置。
3. 维吉尼亚密码:由伊丽莎白一世女王的情报官员布尔内特所使用的密码。
加密时,根据明文中的字母在密钥中找到对应的字母,将明文字母替换为密钥字母。
密钥是一个周期性的字母序列,长度与明文相同。
解密时,根据密文中的字母在密钥中找到对应的字母,将密文字母替换为密钥字母。
这些古典密码的加密方法在现代密码学中已经不再安全,容易被破解,因此不再被广泛使用。
现代密码学更多地采用基于数学原理的复杂加密算法,如对称加密算法、非对称加密算法等。
《网络攻击与防御》实验报告计算机科学与技术学院计算机系网络教研室制一、实验目的(1)编程实现凯撒加密、解密算法,理解密码学基础知识,初步建立密码学思维方式。
(2)通过不断增加凯撒解密难度,理解唯密文解密,提高解密性能。
二、实验环境操作系统:Windows 10操作系统软件工具:C++语言编译环境三、实验内容与实验要求(1)在允许输入密码条件下,编程实现凯撒密码加解密解密。
要求:①从一文本文件读入英文文章(明文或密文)。
②对读入内容加密或解密后写入另一文本文件。
(2)在不允许输入密码条件下,编程实现解密凯撒密码加密密文。
要求绘制三种情况下解密程序流程图,说明不同解密程序存在的不足。
程序需要计算、显示解密使用时间(单位:ms)。
①已知c1 =wklv lv d errn,求p1。
(初级解密)问:两次使用凯撒,能否正确解密?(字符串用凯撒加密后的结果再用凯撒加密一次。
)②已知c1 =go kbo cdenoxdc,或c1 =zh duh vwxghqwv,求p1。
(中级解密)③已知c1 =rxwvlgh wkh eleoh, wkhvh vla zrugv duh wkh prvw idprxv lq doo wkh olwhudwxuh ri wkh zruog. wkhb zhuh vsrnhq eb kdpohw zkhq kh zdv wklqnlqj dorxg, dqg wkhb duh wkh prvw idprxv zrugv lq vkdnhvshduh ehfdxvh kdpohw zdv vshdnlqj qrw rqob iru klpvhoi exw dovr iru hyhub wklqnlqj pdq dqg zrpdq. wr eh ru qrw wr eh, wr olyh ru qrw wr olyh, wr olyh ulfkob dqg dexqgdqwob dqg hdjhuob, ru wr olyh gxoob dqg phdqob dqg vfdufhob. d sklorvrskhu rqfh zdqwhg wr nqrz zkhwkhu kh zdv dolyh ru qrw, zklfk lv d jrrg txhvwlrq iru hyhubrqh wr sxw wr klpvhoi rffdvlrqdoob. kh dqvzhuhg lw eb vdblqj: "l wklqn, wkhuhiruh dp." ,求p1。
(高级解密)对给定较长密文文件进行解密测试,测试结果填入表。
要求密文的内容不少于1000个英文单词,使用凯撒密码加密,加密密码保密。
正确率=正确单词数/单词总数,智能程度:优秀(解密结果正确与否不需要人工判断)、一般。
表四、实验过程与分析(1)在允许输入密码条件下的实验结果。
从file1中读入明文,将密文存放在file2中(2)在不允许输入密码条件下的实验结果①在有单个字母的情况下,初级解密②无单个字母下,中级解密,依次用1-25作为密钥。
③高级解密初级解密:中级解密:高级解密:五、实验结果总结是一种最简单且最广为人知的加密技术。
它是一种替换加密的技术,明文中的所有字母都在字母表上向后(或向前)按照一个固定数目进行偏移后被替换成密文。
例如,当偏移量是3的时候,所有的字母A将被替换成D,B变成E,以此类推。
使用时,加密者查找明文字母表中需要加密的消息中的每一个字母所在位置,并且写下密文字母表中对应的字母。
需要解密的人则根据事先已知的密钥反过来操作,得到原来的明文。
源代码:#include<fstream>#include<iostream>#include<string>#include<cmath>#include<Windows.h>#define N 1000#define TARGET 0.065379#define LIST_LEN 26using namespace std;const double p[LIST_LEN] = {0.082,0.015,0.028,0.042,0.127,0.022,0.02, 0.061,0.07, 0.001,0.008,0.04, 0.024,0.067,0.075,0.019,0.001,0.06, 0.063,0.09,0.028,0.01, 0.024,0.02, 0.001,0.001};string dict[7] = {"we", "be", "to", "am", "you", "are", "the"};void file_print(char *filename){ifstream infile;char ch;int i=0;infile.open(filename, ios::in);if(!infile){cout<<"open error!"<<endl;exit(1);}while(infile.get(ch)){cout<<ch;}cout<<endl;infile.close();}int number(char *filename){ifstream infile;char ch;int i=0;infile.open(filename, ios::in);if(!infile){cout<<"open error!"<<endl;exit(1);}while(infile.get(ch)){i++;}infile.close();return i;}void Encrypt(){ifstream infile;ofstream outfile;char ch, *code;unsigned char str[N];code=new char(2);cout<<"明文为:"<<endl;file_print("file1.txt");int n = number("file1.txt");infile.open("file1.txt", ios::in);if(!infile){cout<<"open error!"<<endl;exit(1);}cout<<"请输入一位英文字符密码:"<<endl; cin>>code;code[1]='\0';//cout<<code[1];if(code[1]!='\0')cout<<"输入错误,请输入一位英文字符:"<<endl; if(code[0]>=65 && code[0]<=90){code[0] += 32;}for(int i=0;i<n;i++){infile>>str[i];}outfile.open("file2.txt");if(!outfile){cout<<"open error!"<<endl;exit(1);}int key = code[0]-97;cout<<"密钥为:"<<key<<endl;for(i=0;str[i]!=0;i++){if(str[i]>=65 && str[i]<=90)str[i] += 32;if(str[i]<97 || str[i]>122) continue; str[i]+=key;if(str[i]>122){str[i] -= 26;}outfile.put(str[i]);}infile.close();outfile.close();cout<<"密文为:"<<endl;file_print("file2.txt");}void primary(char c){DWORD start_time = GetTickCount(); ifstream infile;char ch;unsigned char str[N];infile.open("file3.txt", ios::in);if(!infile){cout<<"open error!"<<endl;exit(1);}for(int i=0;infile.get(ch);i++){str[i]=ch;//cout<<str[i];}int key = abs(c-'a');//cout<<key;cout<<"密文为:"<<endl;file_print("file3.txt");int n = number("file3.txt");//cout<<n;cout<<"明文为:"<<endl;for(i=0;i<n;i++){if(str[i] == ' '){str[i] = 32;cout<<str[i];}if(str[i]<97 || str[i]>122)cout<<str[i];else {str[i] -= key;if(str[i]<97) str[i] += 26;cout<<str[i];}}cout<<endl;infile.close();DWORD end_time = GetTickCount();cout << "解密时间为:" <<end_time - start_time<< "ms!" << endl; }void Mediate_senior(unsigned char str[], int n){int key = 1;int similar = 0;for(int i=0;i<n;i++){if(str[i] == ' '){str[i] = 32;cout<<str[i];}if(str[i]<97 || str[i]>122)cout<<str[i];else {str[i] -= key;if(str[i]<97) str[i] += 26;cout<<str[i];}}}void intermediate(){DWORD start_time = GetTickCount();ifstream infile;char ch;unsigned char str[N];infile.open("file3.txt", ios::in);if(!infile){cout<<"open error!"<<endl;exit(1);}cout<<"密文为:"<<endl;for(int i=0;infile.get(ch);i++){str[i]=ch;cout<<ch;}cout<<endl;for(int n=1;n<=25;n++){cout<<"k="<<n<<' ';Mediate_senior(str, number("file3.txt"));printf("\n");}DWORD end_time = GetTickCount();cout << "解密时间为:" <<end_time - start_time<< "ms!" << endl; }/*统计filename中字母出现频率,存放在数组q中*/void count(const char filename[], double q[LIST_LEN]){int i, len = 0; /* len 为字母总个数约等于密文长度*/FILE *fin = fopen(filename, "r");char ch;for (i = 0; i < LIST_LEN; i++) q[i] = 0;while ((ch = fgetc(fin)) != EOF) {if (isalpha(ch)) {len++;ch = tolower(ch);q[ch-'a'] += 1;}}fclose(fin);for (i = 0; i < LIST_LEN; i++) q[i] /= len;}/*破解密钥key,并且将其中数组q存放密文字母出现频率*/int analysis(const char filename[], double q[LIST_LEN]){int i, j, key = 0;double eps = 1; /* eps 存储与TARGET最小差值*/count(filename, q);for (j = 0; j < LIST_LEN; j++) { /*变量j穷举密钥*/double sum = 0, tem;for (i = 0; i < LIST_LEN; i++) {/* 求sum{p[i]*q[i+j]}之和 */int t = (i+j) % 26;sum += p[i] * q[t];}tem = fabs(sum-TARGET);if (tem < eps) {eps = tem; key = j;}}return key:}void senior(){ifstream infile;char ch;unsigned char str[N];infile.open("file4.txt", ios::in); if(!infile){cout<<"open error!"<<endl;exit(1);}for(int i=0;infile.get(ch);i++){str[i]=ch;//cout<<str[i];}double q[LIST_LEN];int key = analysis("file4.txt", q); //cout<<key;file_print("file4.txt");int n = number("file4.txt");//cout<<n;for(i=0;i<n;i++){if(str[i] == ' '){str[i] = 32;cout<<str[i];}if(str[i]<97 || str[i]>122)cout<<str[i];else {str[i] -= key;if(str[i]<97) str[i] += 26;cout<<str[i];}}cout<<endl;infile.close();}void main(){cout<<"密码输入条件下:"<<endl;Encrypt();cout<<"无密码条件下解密:"<<endl;ifstream infile;char ch;infile.open("file3.txt", ios::in);if(!infile){cout<<"open error!"<<endl;exit(1);}int count1=0, count2=0;while(infile.get(ch)){count1++;//cout<<count;if(ch == ' ')count1 = 0;if(infile.peek() == ' '){if(count1 == 1){//cout<<count1;cout<<"初级解密(不能出现一个字母的单词):"<<endl;primary(ch);break;}}count2++;}if(count2 == number("file3.txt")){cout<<"中级解密:";intermediate();}cout<<"高级解密:"<<endl;DWORD start_time = GetTickCount();senior();DWORD end_time = GetTickCount();cout << "解密时间为:" <<end_time - start_time<< "ms!" << endl; }。