古典密码实验报告
- 格式:doc
- 大小:230.00 KB
- 文档页数:25
古典加密实验报告古典密码算法一、实验目的学习常见的古典密码学算法,通过编程实现替代密码算法和置换密码算法,加深对古典密码体制的了解,为深入学习密码学奠定基础。
二、实验要求分析替代密码算法和置换密码算法的功能需求,详细设计实现替代密码算法和置换密码算法的数据结构和流程,给出测试用例和测试步骤,得出测试和结论。
替代密码算法和置换密码算法的实现程序必须提供加密和解密两个接口: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密码”视图,在明文输入区输入明文(明文应为英文),单击“加密”按钮进行加密。
第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、替代密码替代密码算法的原理是使用替代法进行加密,就是将明文中的字符用其他字符替代后形成密文。
例如,明文字母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,此时加密内容不合理,运⾏结果如下:经过以上测试结果可知,程序正确五、实习总结:通过这次实习,我加深了对对凯撒密码的定义的理解,即是把字母表中的每个字母⽤该字母后的某个字母进⾏代替,在对程序设计时,改开始没有考虑周全,没有考虑到移动位数为负值的情况,从⽽出现当输⼊值不正确时程序会报错,其中越界情况⽐较⿇烦,既要考虑到要将输⼊的数字取模,防⽌越界,⼜要考虑到将字母右移后要判断是否越界,其次还要考虑所输⼊字符是否符合标准,总之这次实习也告诉我缜密的思维在程序设计中也是⽐不可少的。
哈尔滨工程大学实验报告实验名称:古典密码算法班级:学号:姓名:实验时间: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)是古典密码中最基本的处理技巧,就是将明文字母由其他字母表中的字母替换的一种方法。