古典密码实验报告

合集下载

古典加密实验报告

古典加密实验报告

古典加密实验报告古典密码算法一、实验目的学习常见的古典密码学算法,通过编程实现替代密码算法和置换密码算法,加深对古典密码体制的了解,为深入学习密码学奠定基础。

二、实验要求分析替代密码算法和置换密码算法的功能需求,详细设计实现替代密码算法和置换密码算法的数据结构和流程,给出测试用例和测试步骤,得出测试和结论。

替代密码算法和置换密码算法的实现程序必须提供加密和解密两个接口:int encrypt()和int decrypt()。

当加密或者解密成功时返回CRYPT_OK,失败时返回CRYPT_ERROR。

三、实验原理古典密码算法曾被广泛应用,大都比较简单,使用手工和机械操作来实现加密和解密。

它的主要应用对象是文字信息,利用密码算法实现文字信息的加密和解密。

下面介绍两种算法:替代密码和置换密码。

1.替代密码的原理是使用替代法进行加密,就是将明文由其它的字母、数字或符合所代替后形成密文。

这里每个明文字母对应的密文字母可能是一个,也可能是多个。

接收者对密文进行逆向替换即可得到明文。

2.置换密码算法的原理是不改变明文字符,而是按照某一规则重新排列消息中的比特或字符顺序,才而实现明文信息的加密。

置换密码有时又称为换位密码。

我实验过程中替代密码是单表替换,用字母的下一个字母代替:for(j = 0; j < i; j++){if(96 < Mingwen[j]&&Mingwen[j] < 123){Miwen[j] = 'a' + (Mingwen[j] - 'a' + 1) % 26;}else{Miwen[j] = 'A' + (Mingwen[j] - 'A' + 1) % 26;}}置换加密主要是对密钥进行整理,还有就是动态分配二维数组,将明文和密文填充置的过程,换密码关键代码如下:for(a = 0; a < k; a++){for(b = 0; b < hang; b++){Miwen[i] = p[b][ord[j]];i++;}j++;}for(a = 0; a < 26; a++){for(b = 0; b < k; b++){if(key1[b] == alphatable[a]){ord[b] = ind++;}}}具体加密见下图:详细加密代码见附件。

古典密码实验报告

古典密码实验报告

实验报告一、实验室名称:SimpleSPC信息安全云实验系统二、实验项目名称:古典密码——置换密码三、实验学时:1学时四、实验原理:1) 算法原理a) 置换密码算法是不改变明文字符,而是按照某一规则重新排列消息中的比特或字符顺序,才而实现明文信息的加密。

将明文中的字母按照给定的顺序安排在一个矩阵中,然后用根据密钥提供的顺序重新组合矩阵中的字母,从而形成密文。

其解密过程是根据密钥的字母数作为列数,将密文按照列、行的顺序写出,再根据密钥给出的矩阵置换产生新的矩阵,从而恢复明文。

b) 置换密码(Permutation Cipher),又称换位密码。

算法实施时,明文的字母保持相同,但顺序会被打乱。

置换只不过是一个简单的换位,每个置换都可以用一个置换矩阵Ek来表示。

每个置换都有一个与之对应的逆置换Dk。

置换密码的特点是仅有一个发送方和接受方知道的加密置换(用于加密)及对应的逆置换(用于解密)。

它是对明文L长字母组中的字母位置进行重新排列,而每个字母本身并不改变。

c) 设n为一固定整数,P、C和K分别为明文空间、密文空间和密钥空间。

明/密文是长度为n的字符序列,分别记为X(x1,x2,…,xn)属于P和Y(y1,y2,…,yn)属于C ,K是定义在{1,2,…,n}的所有置换组成的集合。

对任何一个密钥(即一个置换),定义置换如下:加密置换为:解密置换为:上式中,是的逆置换,密钥空间K的大小为n!2) 算法参数置换密码算法主要有c、m、k、n四个参数。

c为密文,m是明文,k为密钥,n为模数。

3) 算法流程算法流程。

如图所示五、实验目的:1)学习置换密码的原理2)学习置换密码的算法实现六、实验内容:1.在虚拟机上运行置换密码.exe可执行文件,根据提示输入明文和密钥,同时检查输出的解密后的结果是否与明文一致。

2.学习掌握置换密码的原理,并根据明文和密钥计算出对应的加密文,并与程序输出的结果进行比对,掌握其加密解密的过程。

实验一 古典密码—单表代换

实验一 古典密码—单表代换

实验一古典密码—单表代换【实验目的】理解代换密码的基本思想理解移位密码、仿射密码等算法的原理掌握上述各个算法的输入输出格式和密钥格式掌握上述各个算法的加解密过程和实现方法【实验原理】代换密码体制的一般定义为M=C=K=Z26,其中M为明文空间、C为密文空间、K为密钥空间、Z26为26个整数(对应26个英文字母)组成的空间;要求26个字母与模26的剩余类集合{0,1,2,…,25}建立一一对应的关系。

一、移位密码移位密码的加密实现上就是将26个英文字母向后循环移动k位,其加解密可分别表示为:c=E k(m)=m+k(mod 26)m=D k(c)=c-k(mod 26)其中,m、c、k是满足0≤m,c,k≤25的整数。

二、乘法密码乘法密码是通过对字母等间隔抽取以获得密文,其加解密可分别表示如下:-1c=mk(mod 26)m=ck(mod26)其中,m、c、k是满足0≤m,c,k≤25,且gcd(k,26)=1的整数。

三、仿射密码仿射密码的加密是一个线性变换,将移位密码和乘法密码相结合,其加解密可分别表示为:C=E a,b(m)=am+b(mod 26)M=D a,b(C)=a-1(c-b)(mod 26)其中:a、b是密钥,是满足0≤a,b≤25和gcd(a,26)=1的整数,即a和26互素;a-1的逆元,即a•a-1≡1 mod 2【实验环境】ISES客户端Microsoft CLR Debugger 2005或其它调试器【实验内容】通过运算器工具实现移位密码、乘法密码、仿射密码对各个算法的加解密进行扩展实验和算法跟踪【实验步骤】此处以移位密码为例说明,乘法密码、仿射密码可参照完成。

一、加解密计算(一) 加密(1) 参照实验原理,在明文栏输入所要加密的明文,在密钥栏输入相应的密钥,如下图1.1-2所示。

图 1.1-2(2) 点击“加密”按钮,在密文文本框内就会出现加密后的密文,如图1.1-3所示。

古典密码的实验报告

古典密码的实验报告

古典密码的实验报告古典密码的实验报告引言:密码学作为一门古老而又神秘的学科,一直以来都吸引着人们的兴趣。

在古代,人们用各种各样的密码来保护重要信息的安全性。

本实验旨在通过实际操作,探索古典密码的加密原理和破解方法,从而深入了解密码学的基本概念和应用。

一、凯撒密码凯撒密码,又称移位密码,是最简单的一种古典密码。

其原理是通过将明文中的每个字母按照一定的规则进行移位,得到密文。

在本实验中,我们选择了一个简单的凯撒密码进行破解。

首先,我们选择了一段明文:“HELLO WORLD”,并将其按照凯撒密码的规则进行移位,假设移位数为3,则得到密文:“KHOOR ZRUOG”。

接下来,我们尝试使用暴力破解的方法来还原明文。

通过尝试不同的移位数,我们发现当移位数为3时,得到的明文与原文完全一致。

这表明我们成功地破解了凯撒密码,并还原了原始的明文。

二、维吉尼亚密码维吉尼亚密码是一种基于多个凯撒密码组合而成的密码算法。

其原理是通过使用不同的移位数对明文进行加密,从而增加了密码的复杂度。

在本实验中,我们选择了一段明文:“CRYPTOGRAPHY”,并使用维吉尼亚密码进行加密。

我们选择了一个关键词“KEY”作为加密密钥。

首先,我们将关键词“KEY”重复至与明文长度相同,得到“KEYKEYKEYKEYK”。

然后,将明文中的每个字母与关键词中对应位置的字母进行凯撒密码的移位操作。

经过加密后,我们得到了密文:“LXFOPVEFRNHR”。

接下来,我们尝试使用破解方法来还原明文。

通过尝试不同的关键词和移位数的组合,我们发现当关键词为“KEY”且移位数为3时,得到的明文与原文完全一致。

这表明我们成功地破解了维吉尼亚密码,并还原了原始的明文。

三、栅栏密码栅栏密码是一种基于换位操作的密码算法。

其原理是通过将明文中的字母按照一定的规则进行重新排列,得到密文。

在本实验中,我们选择了一段明文:“HELLO WORLD”,并使用栅栏密码进行加密。

古典算法加密实验报告

古典算法加密实验报告

一、实验目的通过本次实验,掌握古典加密算法的基本原理和实现方法,加深对古典加密算法的理解,提高编程能力。

二、实验内容本次实验主要涉及以下古典加密算法:1. 仿射密码2. 单表代替密码3. 维吉尼亚密码三、实验原理1. 仿射密码仿射密码是一种单字母替换密码,其加密原理为将明文进行0~25字母编码,按照加密公式计算出密文对应位置的字母编码,最后从密文的字母编码还原出密文对应位置的字母。

解密原理与加密原理相反。

2. 单表代替密码单表代替密码的加密原理为利用代替表,将明文中的每个字符映射到密文。

解密原理为对代替表进行反向查找,由密文映射回明文。

3. 维吉尼亚密码维吉尼亚密码的加密原理为通过加密方程Ci = (pi k(i mod m)) mod 26,由明文得到密文。

解密原理为解密过程是加密过程的逆过程,通过解密方程pi = (Ci k(i mod m)) mod 26。

四、实验步骤1. 仿射密码(1)编写加密函数encrypt,输入明文和密钥a、b,输出密文。

(2)编写解密函数decrypt,输入密文和密钥a、b,输出明文。

(3)测试加密和解密函数,验证其正确性。

2. 单表代替密码(1)编写加密函数subencrypt,输入明文和代替表,输出密文。

(2)编写解密函数subdecrypt,输入密文和代替表,输出明文。

(3)测试加密和解密函数,验证其正确性。

3. 维吉尼亚密码(1)编写加密函数vigenereencrypt,输入明文和密钥,输出密文。

(2)编写解密函数vigeneredecrypt,输入密文和密钥,输出明文。

(3)测试加密和解密函数,验证其正确性。

五、实验结果与分析1. 仿射密码通过编写encrypt和解密函数,成功实现了仿射密码的加密和解密过程。

实验结果表明,加密和解密函数运行正常,能够正确转换明文和密文。

2. 单表代替密码通过编写subencrypt和解密函数,成功实现了单表代替密码的加密和解密过程。

现代密码学——古典密码算法(实验报告)

现代密码学——古典密码算法(实验报告)

安全SnoWolF/百度B英俊制作课程名称现代密码学实验实验项目名称古典密码算法练习一 Caesar密码加密时每一个字母向前推移k位,例如当k=5时,置换表如表2所示。

表2 Caesar置换表于是对于明文:datasecurityhasevolvedrapidly经过加密后就可以得到密文:IFYFXJHZWNYDMFXJATQAJIWFUNIQD若令26个字母分别对应整数0~25,如表3所示。

表3 Caesar置换表则Caesar加密变换实际上是:c=(m+k)mod26其中m是明文对应的数据,c是与明文对应的密文数据,k是加密用的参数,也称为密钥。

很容易得到相应的Caesar解密变换是:m=D(c)=(c–k)mod26例如明文:datasecurity对应的数据序列:301901842201781924当k=5时经过加密变换得到密文序列:852452397252213243对应的密文为:IFYFXJHZWNYD【实验步骤】本练习主机A、B为一组,C、D为一组,E、F为一组。

首先使用“快照X”恢复Windows系统环境。

一.手动完成Caesar密码(1) 在实验原理部分我们已经了解了Caesar密码的基本原理,那么请同学们写出当密钥k=3时,对应明文:data security has evolved rapidly的密文: GDWD VHFXULWB KDV HYROYHG UDSLGOB 。

(2) 进入实验平台,单击工具栏中的“密码工具”按钮,启动密码工具,在向导区点击“Caesar密码”。

在明文输入区输入明文:data security has evolved rapidly。

将密钥k调节到3,查看相应的密文,并与你手动加密的密文进行比较。

请根据密钥验证密文与明文对应关系是否正确。

二.Caesar加密(1) 进入“加密解密”|“Caesar密码”视图,在明文输入区输入明文(明文应为英文),单击“加密”按钮进行加密。

实验吧_密码学实验报告(3篇)

实验吧_密码学实验报告(3篇)

第1篇一、实验背景密码学是一门研究信息加密与解密的学科,它广泛应用于信息安全领域。

为了更好地理解密码学的基本原理和算法,我们选择了实验吧平台上的密码学实验进行学习。

本次实验旨在通过实际操作,加深对古典密码、对称密码和不对称密码等密码学基本概念的理解,提高密码学应用能力。

二、实验目的1. 理解并掌握古典密码的基本原理和算法;2. 掌握对称密码和不对称密码的基本原理和算法;3. 通过实验操作,提高密码学应用能力;4. 培养团队协作和解决问题的能力。

三、实验内容1. 古典密码实验(1)仿射密码原理:仿射密码是一种单字母替换密码,加密公式为:C = (aP + b) mod 26,其中C为密文字母,P为明文字母,a和b为密钥。

操作步骤:1)编写加密函数encrypt,实现仿射密码加密;2)编写解密函数decrypt,实现仿射密码解密;3)测试加密和解密函数,验证其正确性。

(2)单表代替密码原理:单表代替密码是一种将明文字符映射到密文字符的替换密码。

操作步骤:1)编写加密函数subencrypt,实现单表代替密码加密;2)编写解密函数subdecrypt,实现单表代替密码解密;3)测试加密和解密函数,验证其正确性。

(3)维吉尼亚密码原理:维吉尼亚密码是一种多字母替换密码,加密公式为:C = (P + K[i]) mod 26,其中C为密文字母,P为明文字母,K为密钥,i为索引。

操作步骤:1)编写加密函数vigenereencrypt,实现维吉尼亚密码加密;2)编写解密函数vigeneredecrypt,实现维吉尼亚密码解密;3)测试加密和解密函数,验证其正确性。

2. 对称密码实验(1)DES加密算法原理:DES(Data Encryption Standard)是一种分组加密算法,采用56位密钥,64位分组。

操作步骤:1)编写DES加密函数desencrypt,实现DES加密;2)编写DES解密函数desdecrypt,实现DES解密;3)测试加密和解密函数,验证其正确性。

古典密码的实验报告

古典密码的实验报告

古典密码的实验报告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.凯撒密码是最简单的古典密码之一,但由于移动位置的确定性,易受到频率分析等攻击方式的威胁。

实验1-古典密码算法

实验1-古典密码算法

实验1-古典密码算法一、实验目的通过编程实现替代密码算法和置换密码算法,加深对古典密码体系的了解,为以后深入学习密码学奠定基础。

二、实验原理古典密码算法曾被广泛应用,大都比较简单。

它的主要应用对象是文字信息,利用密码算法实现文字信息的加密和解密。

其中替代密码和置换密码是具有代表性的两种古典密码算法。

1、替代密码替代密码算法的原理是使用替代法进行加密,就是将明文中的字符用其他字符替代后形成密文。

例如,明文字母a、b、c、d,用D、E、F、G做对应替换后形成密文。

最早的替代密码是由Julius Caesar 发明的Caesar (恺撒)密码,又叫循环移位密码。

它的加密过程可以表示为下面的函数:E(m) = (m+k ) mod n其中,m为明文字母在字母表中的位置数;n为字母表中的字母个数;k为密钥;E(m)为密文字母在字母表中对应的位置数。

例如,对于明文字母H,其在字母表中的位置数为8,设k=4,则按照上式计算出来的密文为L,计算过程如下:E(8) = (m+k ) mod n = (8+4 ) mod 26 = 12 = L 解密算法是:m = D(L) =(L-k)mod 262、置换密码置换密码算法的原理是不改变明文字符,只将字符在明文中的排列顺序改变,从而实现明文信息的加密。

置换密码又称为换位密码。

矩阵换位法是实现置换密码的一种常用方法。

它将明文中的字母按照给定的顺序安排在一个矩阵中,然后又根据密钥提供的顺序重新组合矩阵中的字母,从而形成密文。

例如,明文为 attack begins at five ,密钥为 cipher ,将明文按照每行6个字母的形式排在矩阵中,形成如下形式:a t t a c kb e g i n sa t f i v e根据密钥 cipher 中各字母在字母表中出现的先后顺序,得到给定的一个置换:f = 1 4 5 3 2 6因此有:密钥: 1 4 5 3 2 6明文: a t t a c kb e g i n sa t f i v e根据上面的置换,将原有矩阵中的字母按照第1列、第4列、第5列、第3列、第2列、第6列的顺序排列、则有下面的形式:a a c t t kb i n g e sa i v f t e从而得到密文:abatgftetcnvaiikse其解密过程是根据密钥的字母数作为列数,将密文按照列、行的顺序写出,再根据由密钥给出的矩阵置换产生新的矩阵,从而恢复明文。

实验一古典加密算法

实验一古典加密算法

实验⼀古典加密算法实验⼀古典加密算法⼀、实习⽬的1、熟悉java平台的开发环境2、理解常见古典加密算法:凯撒密码、多字母替代密码、多表替代密码3、理解古典加密技术中的替换技术、置换技术。

⼆、实习内容1、问题描述凯撒密码是把字母表中的每个字母⽤该字母后的某个字母进⾏代替。

凯撒密码的通⽤加密算法是:C=E(p)=(P+K)mod26 0凯撒密码的通⽤解密算法是:C=E(p)=(P-K)mod26 02、基本要求实现凯撒密码的加密、解密算法,能够根据⽤户选择密钥和明⽂进⾏加解密。

3、实现提⽰若⽤户输⼊错误信息则可进⾏提⽰。

三、程序设计1、⽤户可以通过键盘输⼊⼀⾏字符串和所要移动的位数,作为所要实现加密的明⽂。

2、由于字母表中共有26个字符,因此,移位前应先将移动的位数和26取模。

Java平台中可以实现字符和证书的⾃动转换,因此将字符加上⼀个正整数代表在字母表中右移位数。

如果移动的位数为负值,则代表在字母中的左移位。

3、移位后仍要判断是否超界,如果超界,则应该做相应的运算,如果c<’a’,则应该加上26,如果c>’z’,则应该减去26,同理c<’A’,则应该加上26,如果c>’Z’,则应该减去26.四、实现测试运⾏界⾯如下:测试⼀:输⼊⼀串字符sdfasdfsd,输⼊⼀个正整数5,运⾏结果如下:测试⼆:输⼊同测试⼀相同的⼀串字符sdfasdfsd,输⼊⼀个负整数-5,运⾏结果如下:测试三:输⼊⼀串字符xyzxxxy,输⼊⼀个正整数5,此时已经超界,运⾏结果如下:测试四:当输⼊的字符中有数字等⾮字母字符时例如sdf323,此时加密内容不合理,运⾏结果如下:经过以上测试结果可知,程序正确五、实习总结:通过这次实习,我加深了对对凯撒密码的定义的理解,即是把字母表中的每个字母⽤该字母后的某个字母进⾏代替,在对程序设计时,改开始没有考虑周全,没有考虑到移动位数为负值的情况,从⽽出现当输⼊值不正确时程序会报错,其中越界情况⽐较⿇烦,既要考虑到要将输⼊的数字取模,防⽌越界,⼜要考虑到将字母右移后要判断是否越界,其次还要考虑所输⼊字符是否符合标准,总之这次实习也告诉我缜密的思维在程序设计中也是⽐不可少的。

密码分析学实验报告

密码分析学实验报告

一、实验目的本次实验旨在让学生了解密码分析学的基本原理和方法,掌握密码分析的基本步骤,并能够运用所学知识对简单的加密算法进行破解。

通过实验,提高学生对密码分析学的认识和实际操作能力。

二、实验内容1. 实验背景密码分析学是研究密码的编制和破译的学科,其主要任务是分析密码系统的安全性,找出其弱点,从而提高密码系统的安全性。

本次实验将针对古典密码和现代密码进行分析。

2. 实验步骤(1)古典密码分析①移位密码分析:选取一组明文和密钥,通过编写程序实现移位密码的加密和解密操作,观察并分析加密结果。

②维吉尼亚密码分析:选取一组明文和密钥,通过编写程序实现维吉尼亚密码的加密和解密操作,观察并分析加密结果。

③周期置换密码分析:选取一组明文和密钥,通过编写程序实现周期置换密码的加密和解密操作,观察并分析加密结果。

(2)现代密码分析①公钥密码分析:选取一组公钥和私钥,通过编写程序实现公钥密码的加密和解密操作,观察并分析加密结果。

②对称密码分析:选取一组密钥,通过编写程序实现对称密码的加密和解密操作,观察并分析加密结果。

3. 实验结果与分析(1)古典密码分析结果①移位密码:通过编写程序,我们可以观察到当密钥正确时,加密后的密文与明文之间的差异较大;当密钥错误时,加密后的密文与明文之间的差异较小。

②维吉尼亚密码:通过编写程序,我们可以观察到当密钥正确时,加密后的密文与明文之间的差异较大;当密钥错误时,加密后的密文与明文之间的差异较小。

③周期置换密码:通过编写程序,我们可以观察到当密钥正确时,加密后的密文与明文之间的差异较大;当密钥错误时,加密后的密文与明文之间的差异较小。

(2)现代密码分析结果①公钥密码:通过编写程序,我们可以观察到当公钥和私钥正确时,加密后的密文与明文之间的差异较大;当公钥和私钥错误时,加密后的密文与明文之间的差异较小。

②对称密码:通过编写程序,我们可以观察到当密钥正确时,加密后的密文与明文之间的差异较大;当密钥错误时,加密后的密文与明文之间的差异较小。

古典密码实验报告

古典密码实验报告

一、实验名称古典密码实验二、实验目的1. 了解古典密码的基本原理和分类。

2. 掌握几种常见的古典密码(如移位密码、凯撒密码、维吉尼亚密码等)的加密和解密方法。

3. 通过编程实现古典密码的加密和解密过程,加深对密码学基础知识的理解。

三、实验内容1. 移位密码2. 凯撒密码3. 维吉尼亚密码4. 暴力破解方法四、实验原理1. 移位密码:将明文字符按照一定的规律进行移位,实现加密。

解密时,将密文字符反向移位,还原明文。

2. 凯撒密码:将明文字符按照固定的偏移量进行移位,实现加密。

解密时,将密文字符反向移位,还原明文。

3. 维吉尼亚密码:利用密钥对明文字符进行加密。

加密时,根据密钥中的字符对应明文字符的偏移量,实现加密。

解密时,根据密钥中的字符对应密文字符的偏移量,实现解密。

4. 暴力破解方法:通过遍历所有可能的密钥,尝试解密密文,找到有意义的明文。

五、实验步骤1. 移位密码(1)创建一个字符串作为明文,例如:“Hello, World!”(2)定义移位量,例如:3(3)编写加密函数,将明文字符按照移位量进行移位,得到密文。

(4)编写解密函数,将密文字符反向移位,还原明文。

2. 凯撒密码(1)创建一个字符串作为明文,例如:“Hello, World!”(2)定义密钥,例如:3(3)编写加密函数,将明文字符按照密钥的偏移量进行移位,得到密文。

(4)编写解密函数,将密文字符反向移位,还原明文。

3. 维吉尼亚密码(1)创建一个字符串作为明文,例如:“Hello, World!”(2)定义密钥,例如:“key”(3)编写加密函数,根据密钥中的字符对应明文字符的偏移量,实现加密。

(4)编写解密函数,根据密钥中的字符对应密文字符的偏移量,实现解密。

4. 暴力破解方法(1)创建一个字符串作为密文,例如:“Khoor, Zruog!”(2)编写暴力破解函数,遍历所有可能的密钥,尝试解密密文。

(3)找到有意义的明文,即为破解成功。

古典密码的加密与破译报告

古典密码的加密与破译报告

实训四古典密码的加密与破译【实训目的】通过实训要求学生进一步了解古典密码学院里,掌握一种加密解密算法,学会用计算机语言编程的方法进行加密和解密。

【实训要求】了解古典密码原理;掌握RSA加密算法;掌握RSA解密算法;学会用一种语言编写加密解密程序。

【实训内容】1.选择一种计算机语言,并打开该语言编辑窗口2.在硬盘上创建一个子目录3.用C++语言编写古典密码的移位,置换等算法的加密和解密程序#include "stdafx.h"#include "Crpt.h"#include "CrptDlg.h"#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endif// CAboutDlg dialog used for App Aboutclass CAboutDlg : public CDialog{public:CAboutDlg();// Dialog Data//{{AFX_DA TA(CAboutDlg)enum { IDD = IDD_ABOUTBOX };//}}AFX_DA TA// ClassWizard generated virtual function overrides//{{AFX_VIRTUAL(CAboutDlg)protected:virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support //}}AFX_VIRTUAL// Implementationprotected://{{AFX_MSG(CAboutDlg)//}}AFX_MSGDECLARE_MESSAGE_MAP()};CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD){//{{AFX_DATA_INIT(CAboutDlg)//}}AFX_DA TA_INIT}void CAboutDlg::DoDataExchange(CDataExchange* pDX){CDialog::DoDataExchange(pDX);//{{AFX_DA TA_MAP(CAboutDlg)//}}AFX_DA TA_MAP}BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)//{{AFX_MSG_MAP(CAboutDlg)// No message handlers//}}AFX_MSG_MAPEND_MESSAGE_MAP()// CCrptDlg dialogCCrptDlg::CCrptDlg(CWnd* pParent /*=NULL*/): CDialog(CCrptDlg::IDD, pParent){//{{AFX_DATA_INIT(CCrptDlg)m_strCt1 = _T("");m_strPt1 = _T("");m_iKey1 = 0;m_strCt2 = _T("");m_iKey2a = 0;m_iKey2b = 0;m_strPt2 = _T("");m_strKey3 = _T("");m_strPt3 = _T("");m_strCt3 = _T("");m_strPt4 = _T("");m_strKey4 = _T("");m_strCt4 = _T("");//}}AFX_DA TA_INIT// Note that LoadIcon does not require a subsequent DestroyIcon in Win32 m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);}void CCrptDlg::DoDataExchange(CDataExchange* pDX){CDialog::DoDataExchange(pDX);//{{AFX_DA TA_MAP(CCrptDlg)DDX_Text(pDX, IDC_CT1, m_strCt1);DDX_Text(pDX, IDC_PT1, m_strPt1);DDX_Text(pDX, IDC_KEY1, m_iKey1);DDX_Text(pDX, IDC_CT2, m_strCt2);DDX_Text(pDX, IDC_KEY2a, m_iKey2a);DDX_Text(pDX, IDC_KEY2b, m_iKey2b);DDX_Text(pDX, IDC_PT2, m_strPt2);DDX_Text(pDX, IDC_KEY3, m_strKey3);DDX_Text(pDX, IDC_PT3, m_strPt3);DDX_Text(pDX, IDC_CT3, m_strCt3);DDX_Text(pDX, IDC_PT4, m_strPt4);DDX_Text(pDX, IDC_KEY4, m_strKey4);DDX_Text(pDX, IDC_CT4, m_strCt4);//}}AFX_DA TA_MAP}BEGIN_MESSAGE_MAP(CCrptDlg, CDialog)//{{AFX_MSG_MAP(CCrptDlg)ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON_BN_CLICKED(IDC_METH1, OnMeth1)ON_BN_CLICKED(IDC_KEY1SET, OnKey1set)ON_BN_CLICKED(IDC_E1, OnE1)ON_BN_CLICKED(IDC_D1, OnD1)ON_BN_CLICKED(IDC_CLEARPT1, OnClearpt1)ON_BN_CLICKED(IDC_CLEARCT1, OnClearct1)ON_BN_CLICKED(IDC_METH2, OnMeth2)ON_BN_CLICKED(IDC_KEY2SET, OnKey2set)ON_BN_CLICKED(IDC_E2, OnE2)ON_BN_CLICKED(IDC_D2, OnD2)ON_BN_CLICKED(IDC_CLEARPT2, OnClearpt2)ON_BN_CLICKED(IDC_CLEARCT2, OnClearct2)ON_BN_CLICKED(IDC_METH3, OnMeth3)ON_BN_CLICKED(IDC_KEY3SET, OnKey3set)ON_BN_CLICKED(IDC_E3, OnE3)ON_BN_CLICKED(IDC_D3, OnD3)ON_BN_CLICKED(IDC_CLEARPT3, OnClearpt3)ON_BN_CLICKED(IDC_CLEARCT3, OnClearct3)ON_BN_CLICKED(IDC_METH4, OnMeth4)ON_BN_CLICKED(IDC_KEY4SET, OnKey4set)ON_BN_CLICKED(IDC_E4, OnE4)ON_BN_CLICKED(IDC_D4, OnD4)ON_BN_CLICKED(IDC_CLEARPT4, OnClearpt4)ON_BN_CLICKED(IDC_CLEARCT4, OnClearct4)//}}AFX_MSG_MAPEND_MESSAGE_MAP()// CCrptDlg message handlersBOOL CCrptDlg::OnInitDialog(){CDialog::OnInitDialog();// Add "About..." menu item to system menu.// IDM_ABOUTBOX must be in the system command range.ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);ASSERT(IDM_ABOUTBOX < 0xF000);CMenu* pSysMenu = GetSystemMenu(FALSE);if (pSysMenu != NULL){CString strAboutMenu;strAboutMenu.LoadString(IDS_ABOUTBOX);if (!strAboutMenu.IsEmpty()){pSysMenu->AppendMenu(MF_SEPARATOR);pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);}}// Set the icon for this dialog. The framework does this automatically// when the application's main window is not a dialogSetIcon(m_hIcon, TRUE); // Set big iconSetIcon(m_hIcon, FALSE); // Set small icon// TODO: Add extra initialization herem_bJ1 = 0;m_bJ2 = 0;m_bJ3 = 0;m_bJ4 = 0;return TRUE; // return TRUE unless you set the focus to a control}void CCrptDlg::OnSysCommand(UINT nID, LPARAM lParam){if ((nID & 0xFFF0) == IDM_ABOUTBOX){CAboutDlg dlgAbout;dlgAbout.DoModal();}else{CDialog::OnSysCommand(nID, lParam);}}// If you add a minimize button to your dialog, you will need the code below// to draw the icon. For MFC applications using the document/view model,// this is automatically done for you by the framework.void CCrptDlg::OnPaint(){if (IsIconic()){CPaintDC dc(this); // device context for paintingSendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);// Center icon in client rectangleint cxIcon = GetSystemMetrics(SM_CXICON);int cyIcon = GetSystemMetrics(SM_CYICON);CRect rect;GetClientRect(&rect);int x = (rect.Width() - cxIcon + 1) / 2;int y = (rect.Height() - cyIcon + 1) / 2;// Draw the icondc.DrawIcon(x, y, m_hIcon);}else{CDialog::OnPaint();}}// The system calls this to obtain the cursor to display while the user drags// the minimized window.HCURSOR CCrptDlg::OnQueryDragIcon(){return (HCURSOR) m_hIcon;}void CCrptDlg::OnMeth1(){// TODO: Add your control notification handler code hereAfxMessageBox(" 移位密码介绍:\r 字母表用整数0 - 25来标识,密钥K 为整数,且取值空间为0到25\r 加密函数:x = x + k (mod 26)\r 解密函数:x = x - k (mod 26)\r 当K=3时,为凯撒密码\r 不识别空格", MB_ICONINFORMATION);}void CCrptDlg::OnKey1set(){// TODO: Add your control notification handler code hereUpdateData();m_bJ1 = 1;}void CCrptDlg::OnE1(){// TODO: Add your control notification handler code hereif (m_bJ1 == 0){AfxMessageBox("请检查是否设置了密钥或输入了明文");}else{UpdateData();int i = m_strPt1.GetLength();m_strCt1.Empty();for (int j = 0; j < i; j++){m_strCt1 += (m_strPt1[j] - 97 + m_iKey1) % 26 + 97; }UpdateData(FALSE);}}void CCrptDlg::OnD1(){// TODO: Add your control notification handler code hereif (m_bJ1 == 0){AfxMessageBox("请检查是否设置了密钥或输入了密文");}else{UpdateData();int i = m_strCt1.GetLength();m_strPt1.Empty();for (int j = 0; j < i; j++){if (m_strCt1[j] - 97 - m_iKey1 >= 0){m_strPt1 += (m_strCt1[j] - 97 - m_iKey1) % 26 + 97;}else{m_strPt1 += m_strCt1[j] + 26 - m_iKey1;}}UpdateData(FALSE);}}void CCrptDlg::OnClearpt1(){// TODO: Add your control notification handler code hereUpdateData();m_strPt1.Empty();UpdateData(FALSE);}void CCrptDlg::OnClearct1(){// TODO: Add your control notification handler code hereUpdateData();m_strCt1.Empty();UpdateData(FALSE);}void CCrptDlg::OnMeth2(){// TODO: Add your control notification handler code hereAfxMessageBox(" 仿射密码介绍:\r 字母表用整数0 - 25来标识,密钥对由a、b组成\r 整数a满足gcd(a, 26) = 1 \r 整数b的取值空间为0到25\r 加密函数:x = ax + b(mod 26)\r 解密函数:x = a*y - a*b (mod 26)\r 当a=1,b=3时,为凯撒密码\r 不识别空格", MB_ICONINFORMA TION);}void CCrptDlg::OnKey2set(){// TODO: Add your control notification handler code hereUpdateData();m_bJ2 = 1;}void CCrptDlg::OnE2(){// TODO: Add your control notification handler code hereif (m_bJ2 == 0){AfxMessageBox("请检查是否设置了密钥或输入了明文");}else{UpdateData();int i = m_strPt2.GetLength();m_strCt2.Empty();for (int j = 0; j < i; j++){m_strCt2 += ((m_strPt2[j] - 97) * m_iKey2a + m_iKey2b) % 26 + 97; }UpdateData(FALSE);}}void CCrptDlg::OnD2(){// TODO: Add your control notification handler code hereif (m_bJ2 == 0){AfxMessageBox("请检查是否设置了密钥或输入了密文");}else{UpdateData();int i = m_strCt2.GetLength();m_strPt2.Empty();int a = transt(m_iKey2a);for (int j = 0; j < i; j++){if (m_strCt2[j] - 97 - m_iKey2b < 0){m_strPt2 += ((m_strCt2[j] - 97 - m_iKey2b) * a + 26) % 26 + 97;}else{m_strPt2 += ((m_strCt2[j] - 97 - m_iKey2b) * a) % 26 + 97;}} UpdateData(FALSE);}}void CCrptDlg::OnClearpt2(){// TODO: Add your control notification handler code hereUpdateData();m_strPt2.Empty();UpdateData(FALSE);}void CCrptDlg::OnClearct2(){// TODO: Add your control notification handler code hereUpdateData();m_strCt2.Empty();UpdateData(FALSE);}void CCrptDlg::OnMeth3(){// TODO: Add your control notification handler code hereAfxMessageBox("维吉尼亚密码介绍:\r 首先确定密钥长度(本例中密钥只采取个位数字,所以取决于输入密钥的长度)如6\r 然后输入满足这个长度的向量,如K = (1,2,3,4,5,6)\r 加密:取明文第一个字母并将之移k1位,这里k1=1,第二个字母移k2位,k2=2,一旦到了密钥末尾,又从头开始\r 不识别空格", MB_ICONINFORMA TION);}void CCrptDlg::OnKey3set(){// TODO: Add your control notification handler code hereUpdateData();m_bJ3 = 1;}void CCrptDlg::OnE3(){// TODO: Add your control notification handler code hereif (m_bJ3 == 0){AfxMessageBox("请检查是否设置了密钥或输入了明文");}else{UpdateData();m_strCt3.Empty();int keylen = m_strKey3.GetLength();int ptlen = m_strPt3.GetLength();int i, j, m, n;i = ptlen / keylen;j = ptlen % keylen;for (n = 0; n < i; ++n){for (m = 0; m < keylen; ++m){if (m_strPt3[n * keylen + m] + m_strKey3[m] - 'a' > 'z'){m_strCt3 += m_strPt3[n * keylen + m] + m_strKey3[m] - 'a' - 26;}else{m_strCt3 += m_strPt3[n * keylen + m] + m_strKey3[m] - 'a';}}} for (m = 0; m < j; ++m){if (m_strPt3[n * keylen + m] + m_strKey3[m] - 'a' > 'z'){m_strCt3 += m_strPt3[n * keylen + m] + m_strKey3[m] - 'a' - 26;}else{m_strCt3 += m_strPt3[n * keylen + m] + m_strKey3[m] - 'a';}} UpdateData(FALSE);}}void CCrptDlg::OnD3(){// TODO: Add your control notification handler code hereif (m_bJ3 == 0){AfxMessageBox("请检查是否设置了密钥或输入了密文");}else{UpdateData();m_strPt3.Empty();int keylen = m_strKey3.GetLength();int ctlen = m_strCt3.GetLength();int i, j, m, n;i = ctlen / keylen;j = ctlen % keylen;for (n = 0; n < i; ++n){for (m = 0; m < keylen; ++m){if (m_strCt3[n * keylen + m] - m_strKey3[m] + 'a' < 'a'){m_strPt3 += m_strCt3[n * keylen + m] - m_strKey3[m] + 'a' + 26;}else{m_strPt3 += m_strCt3[n * keylen + m] - m_strKey3[m] + 'a';}}}for (m = 0; m < j; ++m){if (m_strCt3[n * keylen + m] - m_strKey3[m] + 'a' < 'a'){m_strPt3 += m_strCt3[n * keylen + m] - m_strKey3[m] + 'a' + 26;}else{m_strPt3 += m_strCt3[n * keylen + m] - m_strKey3[m] + 'a';}} UpdateData(FALSE);}}void CCrptDlg::OnClearpt3(){// TODO: Add your control notification handler code hereUpdateData();m_strPt3.Empty();UpdateData(FALSE);}void CCrptDlg::OnClearct3(){// TODO: Add your control notification handler code hereUpdateData();m_strCt3.Empty();UpdateData(FALSE);}void CCrptDlg::OnMeth4(){// TODO: Add your control notification handler code hereAfxMessageBox("换位密码介绍:\r 确定密钥长度,如5 \r 输入长度为5的0到4的整数序列,如14032作为密钥\r 将明文分成每5个字母一组,每组字母按照密钥进行换位\r 不识别空格", MB_ICONINFORMA TION);}void CCrptDlg::OnKey4set(){// TODO: Add your control notification handler code hereUpdateData();m_bJ4 = 1;}void CCrptDlg::OnE4(){// TODO: Add your control notification handler code hereif (m_bJ4 == 0){AfxMessageBox("请检查是否设置了密钥或输入了明文");}else{UpdateData();m_strCt4.Empty();int keylen = m_strKey4.GetLength();int ptlen = m_strPt4.GetLength();int i = ptlen / keylen;int j = ptlen % keylen;if (0 != j){for(int m = 0; m < keylen - j; ++m){m_strPt4 += 'x';}i++;}int n, m, k;for (n = 0; n < i; ++n){for (m = 0; m < keylen; ++m){for (k = 0; k < keylen; ++k){if (m_strKey4[k] == '0' + m){m_strCt4 += m_strPt4[n * keylen + k]}}}}UpdateData(FALSE);}}void CCrptDlg::OnD4(){// TODO: Add your control notification handler code hereif (m_bJ4 == 0){AfxMessageBox("请检查是否设置了密钥或输入了密文");}else{UpdateData();m_strPt4.Empty();int keylen = m_strKey4.GetLength();int ctlen = m_strCt4.GetLength();CString key;key.Empty();for (int e = 0; e < keylen; ++e){for (int f = 0; f < keylen; ++f){if (e == m_strKey4[f]){key += m_strKey4[f];}}}int i = ctlen / keylen;int j = ctlen % keylen;if (0 != j){AfxMessageBox("请检查密文格式是否正确");}else{int n, k;for (n = 0; n < i; ++n){for (k = 0; k < keylen; ++k){m_strPt4 += m_strCt4[n * keylen + m_strKey4[k] - '0'];}}} UpdateData(FALSE);}}void CCrptDlg::OnClearpt4(){// TODO: Add your control notification handler code hereUpdateData();m_strPt4.Empty();UpdateData(FALSE);}void CCrptDlg::OnClearct4(){// TODO: Add your control notification handler code hereUpdateData();m_strCt4.Empty();UpdateData(FALSE);}int CCrptDlg::transt(int a){if (1 == a){return 1;}else{int b, q, r, q0, x, x0, x1;r = 1;b = 26;x1 = 1;x0 = 0;q0 = -1;while (0 != r){q = b / a;r = b % a;x = q0 * (-1) * x0 + x1;q0 = q;x1 = x0;x0 = x;b = a;a = r;}return x;}}4.编写RSA算法的加密解密程序#include <iostream.h>#include <conio.h>#include <math.h>#include <stdlib.h>#include <string.h>int go(int k,char bk[16]);int Transform(int m,int k,int n);int gcd(int a,int b);int IsPrime(int a);go(int k,char bk[16]){int n = 0;while( k > 0) {bk[n] = k % 2;n++;k/= 2;}return k;}int Transform(int m,int k,int n){ long int r=1;char bk[16];go(k,bk);for(int i=15; i>=0; i--){ r=(r*r)%n;if (bk[i] ==1){ r=(r*m)%n; } }return r; }int gcd(int a,int b){ for(int i=2;i <=sqrt(a <b?a:b);i++)if ((a%i ==0)&&(b%i==0))return 0;return 1; }int IsPrime(int a){ for(int i=2;i <=sqrt(a);i++)if(a%i==0) return 0;return 1; }void main(){ int c,e,d,m,n,z,p,q;cout << "\t************简单RSA加密解密算法***********\n\n "; cout <<"请输入p: ";cin>> p;while(!IsPrime(p)){ cout << "您输入的p不是素数,请重新输入: "; cin>> p; }cout << "请输入q: ";cin>> q;while(!IsPrime(q)){ cout << "您输入的q不是素数,请重新输入: "; cin>> q; }cout << "\n由p和q求得n和ф(n) " <<endl;n=p*q;z=(p-1)*(q-1);cout << "n =" <<n << " and " << "ф(n) =" <<z <<endl; cout <<endl << "请输入e: ";cin>> e;while (!gcd(e,z)){ cout << "e应该和ф(n)互素: ";cin>> e; }cout << "求得解密密钥" ;d=1;while (((e*d)%z)!=1) d++;cout << "d =" << d << endl;cout <<endl << "请输入明文m: " ;cin>> m;while (m>=n||m<=0){ cout << "请重新输入明文m(0<m<"<<n<<")"; cin>> m; }cout << "求得密文为:";c=Transform(m,e,n);cout << "c =" <<c <<endl;cout <<endl << "请输入密文c: " ;cin>> c;cout << "求得明文为:" ;m=Transform(c,d,n);cout << "m =" <<m <<endl;getch(); }4.运行并调试改程序。

古典密码实验报告

古典密码实验报告

古典密码实验报告一、实验目的本次古典密码实验的主要目的是深入了解和掌握几种常见的古典密码技术,包括恺撒密码、栅栏密码、维吉尼亚密码等,并通过实际操作和分析,探究其加密和解密的原理与过程,以及这些密码技术的安全性和局限性。

二、实验环境本次实验在个人计算机上进行,使用了 Python 编程语言作为主要的实验工具。

同时,还借助了一些在线密码分析工具和网站,以辅助对密码的分析和破解。

三、实验原理(一)恺撒密码恺撒密码是一种简单的替换密码,通过将明文中的每个字母按照一定的偏移量进行替换来实现加密。

例如,偏移量为 3 时,A 被替换为D,B 被替换为 E,以此类推。

(二)栅栏密码栅栏密码是一种置换密码,将明文按照一定的栏数进行分组,然后按照一定的顺序读取分组中的字母来得到密文。

(三)维吉尼亚密码维吉尼亚密码是一种多表替换密码,使用一个密钥字符串来决定每个明文字母的替换字母。

密钥字符串被重复使用,直到覆盖整个明文。

四、实验步骤(一)恺撒密码实验1、选择一段明文,例如:“Hello World”。

2、设定偏移量,假设为 5。

3、按照恺撒密码的加密规则,对明文中的每个字母进行偏移替换,得到密文。

4、尝试对密文进行解密,通过反向偏移来恢复明文。

(二)栅栏密码实验1、选取一段明文,比如:“This is a secret message”。

2、确定栏数,假设为 3。

3、将明文按照栏数进行分组,并按照特定顺序读取字母,得到密文。

4、尝试通过分析密文的规律,恢复明文。

(三)维吉尼亚密码实验1、选择明文,例如:“Encryption and Decryption”。

2、设定密钥,如“KEY”。

3、根据维吉尼亚密码的加密规则,使用密钥对明文进行加密。

4、尝试对生成的密文进行破解,分析密钥的长度和可能的内容。

五、实验结果与分析(一)恺撒密码1、加密结果:明文“Hello World”在偏移量为 5 的情况下,加密得到的密文为“Mjqqt Btwqi”。

古典密码的实验报告

古典密码的实验报告

一、实验目的1. 了解古典密码的基本原理和分类。

2. 掌握仿射密码、维吉尼亚密码和单表密码的加解密过程。

3. 熟悉古典密码的攻击方法,提高密码学素养。

二、实验内容1. 仿射密码(1)原理:仿射密码是一种单表代换密码,其加密和解密过程均采用一个密钥a 和b。

其中,a与26互素,b是任意整数。

加密公式为:C = (aP + b) mod 26,解密公式为:P = a^(-1)(C - b) mod 26。

(2)实现过程:① 随机生成满足条件的密钥a和b。

② 使用加密公式对明文进行加密。

③ 使用解密公式对密文进行解密。

2. 维吉尼亚密码(1)原理:维吉尼亚密码是一种多表替代密码,使用多个凯撒密码字母表对明文进行替代。

加密和解密过程都涉及到密钥,密钥的长度与明文长度相同。

(2)实现过程:① 选择一个密钥,生成对应的凯撒密码字母表。

② 按照密钥的顺序,依次对明文中的每个字母进行替代。

③ 解密过程与加密过程相反。

3. 单表密码(1)原理:单表密码是一种简单的代换密码,将明文中的每个字母映射到密文中的另一个字母。

(2)实现过程:① 创建一个代替表,将明文中的每个字母映射到密文中的另一个字母。

② 按照代替表对明文进行加密。

③ 解密过程与加密过程相反。

三、实验结果与分析1. 仿射密码实验结果通过实验,我们成功实现了仿射密码的加密和解密过程。

加密过程生成的密文在解密过程中能够正确还原成明文。

2. 维吉尼亚密码实验结果实验结果表明,维吉尼亚密码的加密和解密过程同样成功。

密钥的长度与明文长度相同,加密效果较好。

3. 单表密码实验结果单表密码的实验结果同样令人满意。

通过创建代替表,我们能够将明文正确映射到密文,解密过程也能成功还原明文。

四、实验结论1. 古典密码的基本原理和分类已经掌握。

2. 仿射密码、维吉尼亚密码和单表密码的加解密过程已经熟练掌握。

3. 古典密码的攻击方法有所了解,为以后学习现代密码学奠定了基础。

五、实验心得通过本次实验,我对古典密码有了更深入的了解。

古典密码实验报告 赵凯鹏

古典密码实验报告 赵凯鹏

古典密码实验【实验原理】代换密码体制的一般定义为M=C=K=Z26,其中M为明文空间、C为密文空间、K为密钥空间、Z26为26个整数(对应26个英文字母)组成的空间;要求26个字母与模26的剩余类集合{0,1,2,…,25}建立一一对应的关系。

一、移位密码移位密码的加密实现上就是将26个英文字母向后循环移动k位,其加解密可分别表示为:c=E k(m)=m+k(mod 26)m=D k(c)=c-k(mod 26)其中,m、c、k是满足0≤m,c,k≤25的整数。

二、乘法密码乘法密码是通过对字母等间隔抽取以获得密文,其加解密可分别表示如下:c=mk(mod 26)m=ck-1(mod26)其中,m、c、k是满足0≤m,c,k≤25,且gcd(k,26)=1的整数。

三、仿射密码仿射密码的加密是一个线性变换,将移位密码和乘法密码相结合,其加解密可分别表示为:c=E a,b(m)=am+b(mod 26)m=D a,b(m)=a-1(c-b)(mod 26)其中:a、b是密钥,是满足0≤a,b≤25和gcd(a,26)=1的整数,即a和26互素;a-1表示a的逆元,即a-1•a≡1 mod 26。

四、Playfair密码Playfair是一个人工对称加密技术,由Charles Wheatstone在1854年发明,得名于其推广者Lord Playfair。

Playfair密码是一种著名的双字母单表替代密码,实际上Playfair密码属于一种多字母替代密码,它将明文中的双字母作为一个单元对待,并将这些单元转换为密文字母组合。

Playfair密码基于一个5×5的字母矩阵,该矩阵通过使用一个英文短语或单词串即密钥来构造,去掉密钥中重复的字母得到一个无重复字母的字符串,然后再将字母表中剩下的字母依次从左到右、从上往下填入矩阵中。

例如,若密钥为“playfair is a digram cipher”,去除重复字母后,得到有效密钥“playfirsdgmche”,可得字母矩阵如图1.1.1-1所示。

古典密码实训报告

古典密码实训报告

一、实训背景随着信息技术的飞速发展,信息安全已成为国家安全和公民利益的重要保障。

为了提高学生对古典密码学的理解和应用能力,我们进行了古典密码实训。

本次实训旨在让学生了解古典密码学的基本概念、基本术语,掌握古典密码学中典型的加密算法,并了解针对古典密码学的攻击与防范方法。

二、实训目标1. 了解古典密码学的基本概念和基本术语;2. 掌握古典密码学中典型的加密算法,如凯撒密码、维吉尼亚密码等;3. 熟悉古典密码的攻击与防范方法;4. 培养学生运用古典密码学知识解决实际问题的能力。

三、实训内容1. 古典密码学基本概念与术语古典密码学是密码学的一个分支,主要研究在古代使用的密码技术。

它起源于公元前400年,最早的密码技术是斯巴达人的塞塔式密码。

古典密码学的基本术语包括:明文、密文、加密、解密、密钥等。

2. 典型加密算法(1)凯撒密码:凯撒密码是一种替换加密技术,明文字符按照密钥指定的偏移量进行替换。

例如,密钥为3,则A替换为D,B替换为E,以此类推。

(2)维吉尼亚密码:维吉尼亚密码是一种多字母替换加密技术,明文字符按照密钥中字母的顺序进行替换。

密钥可以重复使用,以提高加密强度。

3. 攻击与防范方法(1)频率分析:通过分析密文中的字符频率,推断出密钥,从而破解密码。

(2)试错法:尝试所有可能的密钥,直到找到正确的密钥。

(3)防范方法:提高密钥的复杂度,增加密钥长度,使用更复杂的加密算法等。

四、实训过程1. 学习古典密码学基本概念和术语,了解古典密码的发展历程。

2. 学习凯撒密码和维吉尼亚密码的加密和解密方法,通过编程实现加密和解密过程。

3. 分析密钥的攻击与防范方法,了解频率分析和试错法的原理。

4. 完成实训项目,如编写一个简单的凯撒密码加密程序,并尝试破解其他学生的加密信息。

五、实训成果1. 掌握了古典密码学的基本概念和基本术语;2. 熟练掌握了凯撒密码和维吉尼亚密码的加密和解密方法;3. 了解并掌握了针对古典密码的攻击与防范方法;4. 提高了编程能力和问题解决能力。

实验一 古典密码Vigenere 实验报告

实验一 古典密码Vigenere 实验报告

实验环境
实验 内容
1、根据实验原理部分对 Vigenere 密码算法的介绍,编写 Vigenere 加密算法的实现 程序,要求:用户从键盘输入密钥 k 和任意的明文信息,输出相应的密文。
2、针对以上加密程序段,编程实现解密。要求:解密的对象就是上一程序段的输 出结果。 要求: 上述密码算法的实现程序命名为 vigenere.c, 分别提供加、 解密函数: encrypt( ) 和 decrypt( ) 。
实验名称
古典密码算法
通过编程实现 Vigenere 密码的加、解密算法,加深对古典密码体制的了解,为
实验目的 深入学习密码学奠定基础。
Vigenere 体制是 1586 年由法国密码学家 Blaise de Vigenere 发明的多表简单加法 密码。 设明文 m = m1 m2 L mn ,密钥
k = k1 k 2 L k n ,
则密文
c = E k (m) = c1 c 2 L c n
实验原理
其中ci = (mi + k i )mod26, i = 1,2,L, n.
当密钥的长度比明文短时,密钥可以周期性的重复使用,直至完成文中 每个字母的加密。
运行 Windows 操作系统的 PC 机,具有 VC++ 6.0 语言编译环境。
实 验 过 程
实验 结果 示例
实验 心得
学号姓名班级时间成绩实验名称古典密码算法实验目的通过编程实现vigenere密码的加解密算法加深对古典密码体制的了解为深入学习密码学奠定基础
陕西师范大学数学与信息科学学院 信 息 安 全 实 验 报 告
学号________姓名 姓名________ 班级 班级________ 时间 时间________ 成绩 成绩_______ 学号 姓名

古典密码实验报告

古典密码实验报告

古典密码实验报告古典密码实验报告一、引言密码学作为一门古老而又神秘的学科,一直以来都吸引着人们的兴趣。

在古代,人们为了保护重要信息的安全,发明了各种各样的古典密码。

本实验旨在通过实际操作,了解并研究几种古典密码的原理和加密解密过程。

二、凯撒密码凯撒密码是最简单的一种古典密码,它的原理是通过将明文中的每个字母按照一定的偏移量进行替换,从而得到密文。

在实验中,我们选择了一个简短的明文“HELLO”,并将其加密成了密文“KHOOR”。

通过对比明文和密文,我们可以发现,凯撒密码的加密过程非常简单,只需要将明文中的每个字母按照一定的偏移量进行替换即可。

然而,凯撒密码的安全性非常低,因为偏移量很容易被破解。

三、维吉尼亚密码维吉尼亚密码是一种基于凯撒密码的改进密码,它引入了一个密钥序列,通过不同的偏移量来加密明文。

在实验中,我们选择了一个较长的明文“CRYPTOGRAPHY”,并使用密钥序列“KEY”进行加密。

维吉尼亚密码的加密过程相对复杂一些,需要根据密钥序列的长度,对明文中的每个字母选择不同的偏移量进行替换。

通过使用密钥序列“KEY”,我们将明文“CRYPTOGRAPHY”加密成了密文“DWUMQVQWUH”.维吉尼亚密码相较于凯撒密码,提高了加密的复杂度和安全性。

然而,它的密钥序列仍然可能被破解,因此在实际应用中需要更复杂的密码算法。

四、栅栏密码栅栏密码是一种将明文按照一定规则排列后再读取的密码算法。

在实验中,我们选择了一个较短的明文“HELLO WORLD”,并使用栅栏数为3进行加密。

栅栏密码的加密过程非常简单,只需要将明文按照栅栏数进行排列,然后按照从上到下、从左到右的顺序读取即可。

通过使用栅栏数为3,我们将明文“HELLO WORLD”加密成了密文“HWEOLLLROD”.栅栏密码的加密过程简单快捷,但是它的安全性也很低。

由于栅栏数有限,密文很容易被破解。

五、结论通过本次实验,我们对凯撒密码、维吉尼亚密码和栅栏密码进行了实际操作和研究。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

哈尔滨工程大学实验报告实验名称:古典密码算法班级:学号:姓名:实验时间:2014年4月成绩:指导教师:实验室名称:哈尔滨工程大学实验室与资产管理处制一、实验名称古典密码算法二、实验目的通过编程实现经典的代替密码算法和置换密码,包括移位密码、维吉尼亚密码、周期置换密码、列置换密码,加深对代替技术的了解,为现代分组密码实验奠定基础。

三、实验环境(实验所使用的器件、仪器设备名称及规格)运行Windows 或Linux 操作系统的PC 机,具有gcc(Linux)、VC(Windows)等C 语言编译环境。

四、实验任务及其要求(1)根据实验原理部分对移位密码的介绍,自己创建明文信息,并选择一个密钥,编写移位密码的实现程序,实现加密和解密操作。

(2)根据实验原理部分对维吉尼亚密码的介绍,自己创建明文信息,并选择一个密钥,编写维吉尼亚密码的实现程序,实现加密和解密操作。

(3)根据实验原理部分对周期置换密码的介绍,自己创建明文信息,并选择一个密钥,编写周期置换密码的实现程序,实现加密和解密操作。

(4)根据实验原理部分对列置换密码的介绍,自己创建明文信息,并选择一个密钥,编写列置换密码的实现程序,实现加密和解密操作。

五、实验设计(包括原理图、真值表、分析及简化过程、卡诺图、源代码等)1.移位密码移位密码(Shift Cipher)是一种典型的单表替代密码,也称为加法密码。

移位密码的加密方法就是将明文中的每个字母用其在字母表后面的第k 个字母替代,它的加密过程可以表示为: c = (m + k) mod n其中,m 为明文字母在字母表中的位置数;n 为字母表中的字母总数;k 为密钥;c 为密文字母在字母表中对应的位置数。

相应的,移位密码的解密过程可以表示为:m = (c - k) mod n移位密码的一个典型代表就是凯撒密码(Ceaser Cipher),它是k=3 时的移位密码。

使用英文字母表的撒密码的加(解)密可以表示为:m = (c + 3) mod 26 m = (c - 3) mod 26,例如,明文:attacks at nine am密钥:3加密:将明文分组对每一个密文字母,依英文字母表,用其右的第 3 个字母代替密文:dwwdfnv dw qlqh dp另外,使用凯撒密码加密后的密文“dwwdfnvdwilyhsp”,其明文为“attacks at five pm”。

2.维吉尼亚密码维吉尼亚密码(Vigenere Cipher)是一种多表代替密码,其本质是周期移位密码。

维吉尼亚密码的(用户)密钥为一含有d 个字母的有限字母序列k = k0k1…k d-1加密时,首先将用户密钥进行周期扩展(周期为d),扩展后的无限字母序列称为工作密钥,记为K = K0K1…K i…其中K i = K i mod d ,i=0,1,…当d=1 时,维吉尼亚密码就是移位密码。

对于含有l 个字母的明文,维吉尼亚加密过程可以表示为:c i = (m i+K i ) mod n 其中,M = m0m1…m i…m l-1 为明文,C = c0c1…c i…c l-1 为密文,K = K0K1…K i…K l-1 为工作钥,n 为明文字母表的长度,l 为明文长度(含有字母的数目)。

例如,使用用户钥cat,对明文“vigenere cipher”进行维吉尼亚加密。

此时,n=26(对应英文字母表),用户钥c=3、a=0、t=19,得到的密文为“xizgnxtevkpagr”。

置换(Permutation)是古典密码中另一种基本的处理技巧,就是将明文中的字母重新排列,字母本身不变,只是改变其位置。

置换密码(Substitution Cipher)就是使用置换法进行加解密的密码算法,也称为换位密码。

置换密码的密钥是一个置换,它表示了明文字母在密文中出现的位置。

例如,使用密钥π=(3421),对明文“ming”进行加密,得到的密文为“ngim”。

3.周期置换密码周期置换密码是将明文字母按一定长度m 进行分组,把每个分组中的字母按1,2,…,m的一个置换π重排位置次序来得到密文的一种加密方法。

其中的密钥就是置换π,在π的描述中包含了分组长度的信息。

解密时,对密文字符按长度m 进行分组,并按π的逆置换π−1把每组字符重排位置次序来得到明文。

例如,明文:ming chen jiu dian fa dong fan gong加密密钥:3421(i=1,2,3,4 的一个置换π(i) =3,4,2,1)加密:将明文分组(4 个字母一组),然后根据加密密钥给定的置换,对每个明文分组进行置换ming chen jiud ianf adon gfan gongngim enhc udij nfai onda anfg ngog密文:ngimenhcudijnfaiondaanfgngog解密密钥:4312(3412 的逆置换)4.列置换密码列置换密码也称为矩阵置换密码。

其加解密方法如下:把明文字符以固定的宽度m(分组长度)水平地(按行)写在一张纸上,按1,2,…,m 的一个置换π交换列的位置次序,再按垂直方向(即按列)读出即得密文。

解密就是将密文按相同的宽度m 垂直在写在纸上,按置换π的逆置换π−1 交换列的位置次序,然后水平地读出得到明文。

置换π就是密钥。

例如,明文:ming chen jiu dian fa dong fan gong密钥:yu lan hua加密:去掉密钥重复字母得yulanh,得到密钥字母顺序653142得出距阵列数为6,将明文按行填充距阵按列(依顺序)写出距阵中的字母。

密文:giffg hddn0 njngn cuaa0 inano meiog (其中0 为无效字符)解密:加密的逆过程六、实验步骤通过实验分析,将各个古典密码算法编写出来,然后编写一个主函数。

调试,验证加密解密正确性。

#include<stdio.h>#include<string.h>#define CRYPT_OK 1#define CRYPT_ERROR 0#define MAXSIZE 100void ShiftCipher();void VigenereCipher();void CycleCipher();void ColCipher();void main(){int op=0;while(1){printf("Which Cipher would you want ?:1.Shift 2.Vig 3.Cyc 4.Col:\n");scanf("%d",&op);fflush(stdin);switch(op){case 1:{ShiftCipher();}break;case 2:{VigenereCipher();}break;case 3:{CycleCipher();}break;case 4:{ColCipher();}break;}}}//主函数//列置换置换密码int Colencrypt(char* plain,char* cipher,char* key); //列置换置换密码加密算法int Coldecrypt(char* plain,char* cipher,char* key); //列置换置换密码解密算法void ColCipherEncrypt(); //列置换置换密码加密调用void ColCipherDecrypt(); //列置换置换密码解密调用void ColCipher(); //列置换置换密码模块调用int fix(char* m,int T); //字符串补齐修正void ColCipher(){int op=0;while(1){fflush(stdin);printf("__This_is_Coloum_Cipher_Process____________________\n");printf("1 for encrypt,2 for decrypt:");scanf("%d",&op);getchar();switch(op){case 1:{ColCipherEncrypt();}break;case 2:{ColCipherDecrypt();}break;default:{printf("Error Input\n");}}}}//列置换置换密码模块调用void ColCipherEncrypt(){char p[MAXSIZE],c[MAXSIZE],k[MAXSIZE];//定义变量printf("Please Input the Plaintext:\n");gets(p);fflush(stdin);printf("Please Input the ColKey:(连续整数序列置换)\n");gets(k);//获取明文&密钥fix(p,strlen(k));//补齐空格Colencrypt(p,c,k);//调用加密函数printf("Chipertext:\n%s",c);getchar();}//列置换置换密码加密调用void ColCipherDecrypt(){char p[MAXSIZE],c[MAXSIZE],k[MAXSIZE],flag,abc[27];int i,temp;//定义变量printf("Please Input the Ciphertext:\n");gets(c);printf("Do You Know the Key? y/n:");fflush(stdin);scanf("%c",&flag);getchar();switch(flag){case 'y': //若知道密钥则直接经行解密{printf("Please Input the ColKey:\n");gets(k);//获取密钥fix(c,strlen(k));Coldecrypt(p,c,k);//调用函数printf("Plaintext:\n%s\n",p);}break;case 'n': //不知道密钥则对文本进行字母统计分析{printf("Then I can't help you!\n");};break;default:{printf("ERROR\n");}}}//列置换置换密码解密调用int Colencrypt(char* plain,char* cipher,char* key){int i,r,T,n,j;char temp[MAXSIZE];i=0;T=strlen(key);while(plain[i]!='\0'){r=i%T;cipher[i]=plain[i-r+(key[r]-'0')-1];i++;}cipher[i]='\0';n=strlen(cipher)/strlen(key);for(i=0;i<T;i++){for(j=0;j<n;j++){temp[i]=cipher[T*j+i%T];}}temp[strlen(cipher)]='\0';return CRYPT_OK;}//列置换置换密码加密算法int Coldecrypt(char* plain,char* cipher,char* key) {int i,r,T,n,j;char temp[MAXSIZE];i=0;T=strlen(key);while(cipher[i]!='\0'){r=i%T;plain[i]=cipher[i-r+(key[r]-'0')-1];i++;}plain[i]='\0';n=strlen(plain)/strlen(key);for(i=0;i<T;i++) //{for(j=0;j<n;j++){temp[i]=plain[T*j+i];}}temp[strlen(plain)]='\0';plain=temp;return CRYPT_OK;}//列置换置换密码解密算法//移位密码int ShiftEncrypt(char* plain,char* cipher,int key); //移位密码加密算法int ShiftDecrypt(char* plain,char* cipher,int key); //移位密码解密算法void ShiftCipherEncrypt(); //移位密码加密调用void ShiftCipherDecrypt(); //移位密码解密调用void ShiftCipher(); //移位密码模块调用void ShiftCipher(){int op=0;while(1){fflush(stdin);printf("_This_is_Shift_Cipher_Process_________________________\n");printf("1 for encrypt,2 for decrypt:");scanf("%d",&op);getchar();switch(op){case 1:{ShiftCipherEncrypt();}break;case 2:{ShiftCipherDecrypt();}break;default:{printf("Error Input\n");}}}}//移位密码模块调用void ShiftCipherEncrypt(){char p[MAXSIZE],c[MAXSIZE];int key=0;//定义变量printf("Please Input the Plaintext:\n");gets(p);printf("Please Input the ShiftKey:\n");scanf("%d",&key);//获取必要信息ShiftEncrypt(p,c,key);//调用函数printf("Chipertext:\n%s\n",c);getchar();}//移位密码加密调用void ShiftCipherDecrypt(){char p[MAXSIZE],c[MAXSIZE],flag;int key=0;int i;//定义变量printf("Please Input the Ciphertext:\n");gets(c);printf("Do You Know the Key? y/n:");fflush(stdin);scanf("%c",&flag);getchar();switch(flag){case 'y':{printf("Please Input the ShiftKey[0-26]:\n");scanf("%d",&key);//获取必要信息ShiftDecrypt(p,c,26-key);//调用函数printf("Plaintext:\n%s\n",p);getchar();}break;case 'n':{for(i=25;i>0;i--){ShiftDecrypt(p,c,i);printf("Plaintext Shift By %2d is: %s\n",26-i,p);}};break;default:{printf("ERROR\n");}}}//移位密码解密调用int ShiftEncrypt(char* plain,char* cipher,int key){int i=0;while(plain[i]!='\0'){if(plain[i]>='A'&&plain[i]<='Z'){cipher[i]=(plain[i]+key-'A')%26+'A';}else{if(plain[i]>='a'&&plain[i]<='z'){cipher[i]=(plain[i]+key-'a')%26+'a';}elsecipher[i]=plain[i];}i++;}cipher[i]='\0';return CRYPT_OK;}//移位密码加密算法int ShiftDecrypt(char* plain,char* cipher,int key){int i=0;while(cipher[i]!='\0'){if(cipher[i]>='A'&&cipher[i]<='Z'){plain[i]=(cipher[i]-'A'+key)%26+'A';}else{if(cipher[i]>='a'&&cipher[i]<='z'){plain[i]=(cipher[i]-'a'+key)%26+'a';}else{plain[i]=cipher[i];}}i++;}plain[i]='\0';return CRYPT_OK;}//移位密码解密算法//弗吉尼亚密码int Vigenereencrypt(char* plain,char* cipher,char* key); //弗吉尼亚密码加密算法int Vigeneredecrypt(char* plain,char* cipher,char* key); //弗吉尼亚密码解密算法void VigenereCipherEncrypt(); //弗吉尼亚密码加密调用void VigenereCipherDecrypt(); //弗吉尼亚密码解密调用void VigenereCipher(); //弗吉尼亚密码模块调用void Static(char* c); //密文字母频率统计模块void VigenereCipher(){int op=0;while(1){fflush(stdin);printf("__This_is_Vigenere_Cipher_Process_____________________\n");printf("1 for encrypt,2 for decrypt:");scanf("%d",&op);getchar();switch(op){case 1:{VigenereCipherEncrypt();}break;case 2:{VigenereCipherDecrypt();}break;default:{printf("Error Input\n");}}}}//弗吉尼亚密码模块调用void VigenereCipherEncrypt(){char p[MAXSIZE],c[MAXSIZE],k[MAXSIZE];//定义变量printf("Please Input the Plaintext:\n");gets(p);fflush(stdin);printf("Please Input the VigenereKey:(low case)\n");gets(k);//获取必要信息Vigenereencrypt(p,c,k);//调用函数printf("Chipertext:\n%s",c);getchar();}//弗吉尼亚密码加密调用void VigenereCipherDecrypt(){char p[MAXSIZE],c[MAXSIZE],k[MAXSIZE],flag,abc[27];int i,temp;//定义变量printf("Please Input the Ciphertext:\n");gets(c);printf("Do You Know the Key? y/n:");fflush(stdin);scanf("%c",&flag);getchar();switch(flag){case 'y': //若知道密钥则直接经行解密{printf("Please Input the VigenereKey:\n");gets(k);//获取密钥Vigeneredecrypt(p,c,k);//调用函数printf("Plaintext:\n%s\n",p);}break;case 'n': //不知道密钥则对文本进行字母统计分析{Static(c);};break;default:{printf("ERROR\n");}}}//弗吉尼亚密码解密调用int Vigenereencrypt(char* plain,char* cipher,char* key) {int i=0;int T;T=strlen(key);printf("%d",T);while(plain[i]!='\0'){if(plain[i]>='A'&&plain[i]<='Z'){cipher[i]=(plain[i]+key[i%T]-'A'-'a')%26+'A';}else{if(plain[i]>='a'&&plain[i]<='z'){cipher[i]=(plain[i]+key[i%T]-'a'-'a')%26+'a';}elsecipher[i]=plain[i];}i++;}cipher[i]='\0';return CRYPT_OK;}//弗吉尼亚密码加密算法int Vigeneredecrypt(char* plain,char* cipher,char* key){int i=0;int T;int abc[26];T=strlen(key);while(cipher[i]!='\0'){if(cipher[i]>='A'&&cipher[i]<='Z'){plain[i]=(cipher[i]-'A'+26-(key[i%T]-'a'))%26+'A';}else{if(cipher[i]>='a'&&cipher[i]<='z'){plain[i]=(cipher[i]-'a'+26-(key[i%T]-'a'))%26+'a';}else{plain[i]=cipher[i];}}i++;}plain[i]='\0';return CRYPT_OK;}//弗吉尼亚密码解密算法void Static(char* c){int i,temp;int abc[27]={0};i=0;temp=0;while(c[i]!='\0'){if(c[i]>='A'&&c[i]<='Z'){temp=c[i]-'A';}else{if(c[i]>='a'&&c[i]<='z'){temp=c[i]-'a';}else{temp=26;}}abc[temp]++;i++;}for(i=0;i<26;i++){printf("%c:%d\n",i+'A',abc[i]);}printf("Other:%d\n",abc[26]);printf("That's all I can do for you. \n");}//密文字母频率统计模块//周期置换密码int Cycleencrypt(char* plain,char* cipher,char* key); //周期置换密码加密算法int Cycledecrypt(char* plain,char* cipher,char* key); //周期置换密码解密算法void CycleCipherEncrypt(); //周期置换密码加密调用void CycleCipherDecrypt(); //周期置换密码解密调用void CycleCipher(); //周期置换密码模块调用int fix(char* m,int T); //字符串补齐修正void CycleCipher(){int op=0;while(1){fflush(stdin);printf("__This_is_Cycle_Cipher_Process_____________________\n");printf("1 for encrypt,2 for decrypt:");scanf("%d",&op);getchar();switch(op){case 1:{CycleCipherEncrypt();}break;case 2:{CycleCipherDecrypt();}break;default:{printf("Error Input\n");}}}}//周期置换密码模块调用void CycleCipherEncrypt(){char p[MAXSIZE],c[MAXSIZE],k[MAXSIZE];//定义变量printf("Please Input the Plaintext:\n");gets(p);fflush(stdin);printf("Please Input the CycleKey:(连续整数序周期)\n");gets(k);//获取明文&密钥fix(p,strlen(k));//补齐空格Cycleencrypt(p,c,k);//调用加密函数printf("Chipertext:\n%s",c);getchar();}//周期置换密码加密调用void CycleCipherDecrypt(){char p[MAXSIZE],c[MAXSIZE],k[MAXSIZE],flag,abc[27];int i,temp;//定义变量printf("Please Input the Ciphertext:\n");gets(c);printf("Do You Know the Key? y/n:");fflush(stdin);scanf("%c",&flag);getchar();switch(flag){case 'y': //若知道密钥则直接经行解密{printf("Please Input the CycleKey:\n");gets(k);//获取密钥fix(c,strlen(k));Cycledecrypt(p,c,k);//调用函数printf("Plaintext:\n%s\n",p);}break;case 'n': //不知道密钥则对文本进行字母统计分析{printf("Then I can't help you!\n");};break;default:{printf("ERROR\n");}}}//周期置换密码解密调用int Cycleencrypt(char* plain,char* cipher,char* key) {int i,r,T;i=0;T=strlen(key);while(plain[i]!='\0'){r=i%T;cipher[i]=plain[i-r+(key[r]-'0')-1];i++;}cipher[i]='\0';return CRYPT_OK;}//周期置换密码加密算法int Cycledecrypt(char* plain,char* cipher,char* key){int i,r,T;i=0;T=strlen(key);while(cipher[i]!='\0'){r=i%T;plain[i]=cipher[i-r+(key[r]-'0')-1];i++;}plain[i]='\0';return CRYPT_OK;}//周期置换密码解密算法int fix(char* m,int T){int i,max;i=strlen(m);if(i%T==0){return i/T;}else{max=(i/T+1)*T;while(i<max){m[i]=' ';i++;}m[i]='\0';return max;}}七、实验过程与分析八、实验结果总结代替(Substitution)是古典密码中最基本的处理技巧,就是将明文字母由其他字母表中的字母替换的一种方法。

相关文档
最新文档