实验一古典密码-Vigernere算法实验-2022
- 格式:docx
- 大小:39.12 KB
- 文档页数:5
河南工业大学实验报告
一、实验目的
1、理解简单加密算法的原理;
2、掌握Vigenere密码的原理,完成Vigenere密码加解密程序的编写;
3、通过实验,加深对古典密码体制的了解,掌握对字符进行灵活处理的方法。
二、实验要求
根据Vigenere密码的原理编写程序,对输入的符号串能够根据设置的密钥分别正确实现Vigenere加密和解密功能。
三、实验过程及结果
3.2实验结果如下图所示
3.2.1加密测试数据一:
图1
3.2.2加密测试数据二:
图2
3.2.3解密测试数据一:
图3
3.2.4解密测试数据二:
图4
四、实验总结
在做本实验之前,前一天晚上先预习看了一下,然后到第二天做实验时大概有了思路。
当然在实验中出现了一些问题,譬如,对明文大小写字母转换成密文大小写字母,空格处理等等方面。
后来到中午经过网上搜索和同学讨论,一起解决了这些问题。
做完实验后,我清楚地知道了古典密码的加密方式解密方式,对此我产生了一些兴趣,感觉很有趣。
一、实验目的1. 理解维吉尼亚密码算法的原理和加密解密过程。
2. 掌握维吉尼亚密码算法的编程实现。
3. 通过实验,提高对密码学基础知识的理解和应用能力。
二、实验原理维吉尼亚密码算法是一种多表密码,由法国密码学家布莱斯·德·维吉尼亚(Blaise de Vigenère)于16世纪提出。
该算法利用一个密钥来生成一系列凯撒密码,通过将这些凯撒密码依次应用于明文,实现对明文的加密。
加密过程如下:1. 编号:将A-Z以编号0-25编号;2. 选取密钥:举例:wangyuhang;3. 明文处理:去掉所有空格;4. 密钥处理:将密钥重复排列;5. 加密:将明文每个字母和密钥对应位置的字母相加(mod 26),得到新的字母;6. 输出密文。
解密过程如下:1. 编号:将A-Z以编号0-25编号;2. 获取密钥:举例:wangyuhang;3. 密文处理:去掉所有空格;4. 密钥处理:将密钥重复排列;5. 解密:将密文每个字母和密钥对应位置的字母相减(mod 26),得到原始明文;6. 输出明文。
三、实验环境1. 操作系统:Windows 102. 编程语言:C++3. 开发工具:Visual Studio 2019四、实验步骤1. 创建一个名为“VigenereCipher”的C++项目。
2. 在项目中创建一个名为“VigenereCipher.h”的头文件,用于声明加密和解密函数。
3. 在项目中创建一个名为“VigenereCipher.cpp”的源文件,用于实现加密和解密函数。
4. 在项目中创建一个名为“main.cpp”的主程序文件,用于调用加密和解密函数,并进行测试。
5. 编写代码实现以下功能:(1)将明文和密钥转换为数字编码;(2)将数字编码相加(加密)或相减(解密)(mod 26);(3)将数字编码转换回字母编码;(4)输出加密后的密文和解密后的明文。
五、实验结果与分析1. 加密过程输入明文:we are discovered save yourself密钥:wangyuhang输出密文:senxadvyyoikneqywvrekueyals2. 解密过程输入密文:senxadvyyoikneqywvrekueyals密钥:wangyuhang输出明文:wearediscoveredsaveyourself通过实验,验证了维吉尼亚密码算法的正确性和实用性。
第1页 实验一 古典密码算法1、目的使学生认识理解古典密码算法:凯撒密码算法,维吉尼亚密码算法。
2、环境PC 1 PC 1 台、安装软件台、安装软件VC60VC60、、JBuilder8JBuilder8、、Delphi7Delphi7。
3、预备知识 1.凯撒密码的过程: 表1:字母编码表0 1 2 3 4 5 6 7 8 9 10 11 12a b c d e f g h i j k l m13 14 15 16 17 18 19 20 21 22 23 24 25 n o p q r s t u v w x y z 再用配对字母取代信息里的原始字母位移加密法(shift cipher):模数计算。
算。
E E k (x)=(x+k)mod 26(x)=(x+k)mod 26,,D k (y)=(y (y)=(y ––k)mod 26 如:如:k=5;k=5;k=5;““hello world hello world””加密为:加密为:mjqqt mjqqt ….2.维吉尼来密码维吉尼来方阵:(不区分大小写)数学表达式:[]([][])%26;C i P i K i =+ 验证:验证:V[0V[0V[0,,0]=00]=0;;V[25V[25,,25]=24 V[13V[13,,12]=25 0 1 2 3 4 5 6 7 8 9 10 11 12a b c d e f g h i j k l m 13 14 15 16 17 18 19 20 21 22 23 24 25 n o p q r s t u v w x y z 解密:[]([][])%26;P i C i K i =-如:如:k=k=k=””BEST BEST””;“HELLO WORLD WORLD”加密为:”加密为:”加密为:IIDE IIDE …. 4字符一组:字符一组: hell OWOR LDBEST BEST BEST 以第一行字母为列标,2行为行标(为行标(B B ,H )=I =I;; 解密:IIDEBEST BEST,,明文字母是B 行字母为I 的列号H ,或B 列=I 的行H 。
一、实验目的通过本次实验,掌握古典加密算法的基本原理和实现方法,加深对古典加密算法的理解,提高编程能力。
二、实验内容本次实验主要涉及以下古典加密算法: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和解密函数,成功实现了单表代替密码的加密和解密过程。
实验报告一、实验室名称: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、学习掌握置换密码的原理,并根据明文与密钥计算出对应的加密文,并与程序输出的结果进行比对,掌握其加密解密的过程。
vigenere加密密钥:stick(长度为5)明文:Almost all people work hard for success, but not all people can success. Many people ask how to make success. I think the answer is persistence. The way to success is full of failure and difficulty. People should never give up when meet them.AlmostallpeopleworkhardforsuccessbutnotallpeoplecansuccessManypeopleaskhowtomakesuccessI thinktheanswerispersistenceThewaytosuccessisfulloffailureanddifficultyPeopleshouldnevergiveup whenmeetthem密文:seuqc lttnz whxno ohzmr sklhy jlcem wlade lgwvk dexgyhemek flcem wlaok frxgy hemcc cawyd gfimo knkeo klqvragsvr wtvug wkquz wkakc lxveo lamyk qmwue uvmuc alnwvdhnhk aecto sglfs xyqee dmgro gitgc zhcnn fxdgb ybdgehppgx exmvd zxu解题步骤:<一>、使用CAP4软件,把密文复制进“ciphertext”中;<二>、运行“polyalphabetic tools”中的“Kasisiki”,点击“Run”得出该密文的关键字组长为5,如下:1、根据<二>运行的结果,使用普通的“vigenere”解密法,进行解密:执行“polyalphabetic Tools”中的“Low Frequency Analysis”,在“Key Word length”中输入“5”,得出最有可能关键词为“stiak”,如下:②由于知道该密文是使用Vigenere加密法而成的,所以接着运行“cipher”中的“Vigenere”进行解密。
古典密码的实验报告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.凯撒密码是最简单的古典密码之一,但由于移动位置的确定性,易受到频率分析等攻击方式的威胁。
实验一古典密码算法实验一古典密码算法实验名称:古典密码算法实验类型: 设计性实验学时:4适用对象: 信息安全一、实验目的学习常见的古典密码学算法,通过编程实现替代密码算法和置换密码算法,加深对古典密码体制的了解,为深入学习密码学奠定基础。
二、实验要求分析替代密码算法和置换密码算法的功能需求,详细设计实现替代密码算法和置换密码算法的数据结构和流程,给出测试用例和测试步骤,得出测试和结论。
替代密码算法和置换密码算法的实现程序必须提供加密和解密两个接口:int encrypt()和int decrypt()。
当加密或者解密成功时返回CRYPT_OK,失败时返回CRYPT_ERROR。
三、实验原理古典密码算法曾被广泛应用,大都比较简单,使用手工和机械操作来实现加密和解密。
它的主要应用对象是文字信息,利用密码算法实现文字信息的加密和解密。
下面介绍两种常见的具有代表性的古典密码算法,以帮助读者对密码算法建立一个初步的印象。
1.替代密码替代密码的原理是使用替代法进行加密,就是将明文由其它的字母、数字或符合所代替后形成密文。
这里每个明文字母对应的密文字母可能是一个,也可能是多个。
接收者对密文进行逆向替换即可得到明文。
替代密码有五种表现形式:○1单表代替即简单替代密码或者称为单字母代替,明文字母表中的一个字符对应密文字母表中的一个字符。
这是所有加密中最简单的方法。
○2多名码代替就是将明文字母表中的字符映射为密文字母表中的多个字符。
多名码简单代替早在1401年就由DuchyMantua公司使用。
在英文中,元音字母出现频率最高,降低对应密文字母出现频率的一种方法就是使用多名码,如e可能被密文5、13或25替代。
○3多音码代替就是将多个明文字符代替为一个密文字符。
比如将字母“i” 和“j”对应为“K”,“v”和“w”代替为“L”最古老的这种多字母加密始见于1563年由波他的《密写评价》(De furtiois literarum notis)一书。
一、实验目的1. 理解维吉尼亚密码的原理和加密、解密过程。
2. 掌握使用维吉尼亚密码进行加密和解密的方法。
3. 通过实验加深对古典密码学中维吉尼亚密码的理解。
二、实验原理维吉尼亚密码是一种多表代换密码,由密钥控制明文与密文的转换。
其加密和解密过程如下:1. 加密过程:(1)将密钥与明文进行对齐,不足部分进行循环。
(2)根据密钥在密表中找到对应的列,密表中每列对应一个字母。
(3)将明文中的每个字母替换成密表中对应列的字母。
2. 解密过程:(1)将密钥与密文进行对齐,不足部分进行循环。
(2)根据密钥在密表中找到对应的列,密表中每列对应一个字母。
(3)将密文中的每个字母替换成密表中对应列的字母,还原出明文。
三、实验环境1. 操作系统:Windows 102. 编程语言:Python3.83. 工具:Jupyter Notebook四、实验步骤1. 编写加密函数```pythondef vigenere_encrypt(plain_text, key):key = key.upper()plain_text = plain_text.upper()key_length = len(key)key_list = list(key)cipher_text = ''for i, char in enumerate(plain_text):if char.isalpha():key_index = key_list[i % key_length]key_offset = ord(key_index) - ord('A')cipher_char = chr((ord(char) - ord('A') + key_offset) % 26 + ord('A'))cipher_text += cipher_charelse:cipher_text += charreturn cipher_text```2. 编写解密函数```pythondef vigenere_decrypt(cipher_text, key):key = key.upper()cipher_text = cipher_text.upper()key_length = len(key)key_list = list(key)plain_text = ''for i, char in enumerate(cipher_text):if char.isalpha():key_index = key_list[i % key_length]key_offset = ord(key_index) - ord('A')plain_char = chr((ord(char) - ord('A') - key_offset) % 26 + ord('A'))plain_text += plain_charelse:plain_text += charreturn plain_text```3. 编写主函数```pythondef main():plain_text = input("请输入明文:")key = input("请输入密钥:")cipher_text = vigenere_encrypt(plain_text, key)print("加密后的密文为:", cipher_text)decrypted_text = vigenere_decrypt(cipher_text, key)print("解密后的明文为:", decrypted_text)if __name__ == "__main__":main()```4. 运行实验程序,输入明文和密钥,观察加密和解密结果。
实验⼀古典加密算法实验⼀古典加密算法⼀、实习⽬的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. 掌握仿射密码、维吉尼亚密码和单表密码的加解密过程。
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. 古典密码的攻击方法有所了解,为以后学习现代密码学奠定了基础。
五、实验心得通过本次实验,我对古典密码有了更深入的了解。
Vigenere破译系统实验报告一、破译算法的基本思想:Vigenere密码的破译总体来说分为五个部分:1、初始化密文:对于给定的一篇密文我们必须首先进行初始化,初始化的主要作用是为了将密文中的一些非字母全部去掉。
2、密钥长度的推算:统计密文中26个字母出现的概率并将其存放在rate[]数组中,根据获得的rate[]数组计算出重合指数IC,然后通过公式length = ((0.0687 - 0.0385) / (IC - 0.0385))推算出密钥的长度。
3、推算出密钥:根据获得的密钥长度计算出密文分成多少行,row=密文长度/密钥长度,如果密文长度%密钥长度小于密钥长度,则将剩下的密文存放在最后一行lastLength,然后将密文分组,通过生成的每组密文,分别求出移位的加密字母,并合成完整的密钥。
4、破译获得明文:前几步已经破译得到了密文的密钥,那么接下来的操作就相当于密钥和密文已知的情况下解密获得明文,所以我们直接通过传入密文和密钥两个参数调用解密函数就可以算出本篇密文对应的明文。
二、实现代码(1)主调用函数实现代码:package vigenere4;import java.io.BufferedReader;import java.io.FileReader;public class Test {static String c=null;public static void main(String[] args) throws Exception {BufferedReader br=new BufferedReader(newFileReader("e:\\miwen.txt"));//密文文本StringBuffer sbuf=new StringBuffer();//缓冲字符串String line=null;while((line=br.readLine())!=null){sbuf.append(line);//追加到缓冲字符串中}br.close();//读取结束String ciphertext=sbuf.toString();//转换成字符串类型String key = "";key= GetKey.cracker(ciphertext);// 调用破解算法求出密钥System.out.println("破译获得的密钥为:"+key);char mingwen[]=(JieMi.jieMi(ciphertext, key)).toCharArray();//转换成数组类型,方便控制密文以多行形式输出System.out.println("破译得到的明文为:");for(int i=1;i<=mingwen.length;i++){System.out.print(mingwen[i-1]);if(i%60==0){ //每60个字母为一行输出System.out.println();}}bw.write(JieMi.jieMi(ciphertext, key));//将破译的明文写入文本bw.flush();bw.close();br.close();}}(2)破译密钥的代码实现package vigenere4public class GetKey {private static final double LETTER_FREQUENCY[] = { 0.0788, 0.0156, 0.0268,0.0389, 0.1268, 0.0256, 0.0187, 0.0573, 0.0707, 0.0010, 0.0060,0.0394, 0.0244, 0.0706, 0.0776, 0.0186, 0.0009, 0.0594, 0.0634,0.0978, 0.0280, 0.0102, 0.0214, 0.0016, 0.0202, 0.0006 };//26个英文字母在正常英文中出现的概率public static String cracker(String ciphertext) {String key = "", // 存放密钥tempCiphertext = "";// 存放将密文分组后的同组密文int keyLength = 0, // 密钥长度row = 0, // 密文所分成的列数,不记最后一行last_length = 0, // 最后一行长度ciphertextLength;// 密文长度ciphertext = initialize(ciphertext);//初始化密文ciphertextLength = ciphertext.length();// 获得密文长度keyLength = getKeyLength(getRate(ciphertext));// 调用获取密钥长度函数row = (int) ciphertextLength / keyLength;// 获取整数位个行last_length = ciphertextLength % keyLength;// 如最后一行个数小于密钥长度,则存放最后一行的密文个数for (int i = 0; i < keyLength; i++) {tempCiphertext = "";for (int j = 0; j < row; j++) {// 把密文分组tempCiphertext += ciphertext.charAt(keyLength * j + i);// 从整数组当中抽取同组密文}if (last_length > i) {tempCiphertext += ciphertext.charAt(keyLength * row + i);// 从最后余下的密文中抽取同组密文}key += getValue(getRate(tempCiphertext));// 通过生成的每组密文,分别求出移位的加密字母,并合成完整的密钥}return key;}//初始化函数private static String initialize(String ciphertext) {String initialized = "";ciphertext = ciphertext.toLowerCase();//将大写字母转化为小写字母for (int i = 0; i < ciphertext.length(); i++) {char temp = ciphertext.charAt(i);if (temp >= 'a' && temp <= 'z')//将密文中的非字母全部除去initialized += temp;}return initialized;}//获取本段密文中26个字母出现的概率private static double[] getRate(String text) {double[] rate = new double[26];int length = 0;for (int i = 0; i < text.length(); i++) {char temp = text.charAt(i);if (temp >= 'a' && temp <= 'z') {//去除小写字母外的一切字母rate[temp - 97]++;length++;}}for (int i = 0; i < 26; i++) {rate[i] /= length;}return rate;}//破解密钥的长度private static int getKeyLength(double[] rate) {double length = 0.0, IC = 0.0;for (int i = 0; i < rate.length; i++) {IC += (rate[i] * rate[i]);// 计算出重合指数}length = ((0.0687 - 0.0385) / (IC - 0.0385));// 通过公式得出密钥的长度//对密钥长度四舍五入if (length % (int) length < 0.5)return (int) length;elsereturn (int) (length + 1);}//求出每一个密文对应的明文字符private static char getValue(double[] rate) {int Offset = 0;//位移个数double sum = 0.0, d = 0.0, min = 1.0;// 记录与0.065差值最小的数for (int i = 0; i < 26; i++) {for (int j = i; j < i + 26; j++) {sum += rate[j % 26] * LETTER_FREQUENCY[j - i];//移位计算出重合指数}//获取最接近0.065的值d = Math.abs(sum - 0.065);if (d < min) {min = d;Offset = i;}sum = 0;}return (char) (Offset + 97);//返回解出的加密字符}}(3)密钥已知时解密算法的代码实现package vigenere4;public class JieMi {String c=null;public static String jieMi(String ciphertext,String key)throws Exception{//解密算法String plaintext = "";char tempCiphertext, tempKey;key= key.toLowerCase();//把密钥转成小写for (int i = 0, j = 0; i < ciphertext.length(); i++, j++) {tempCiphertext = ciphertext.charAt(i);// 截取密文中的单个字符tempKey=key.charAt(j);// 截取密钥中的单个字符if (tempCiphertext >= 'a' && tempCiphertext <= 'z') {// 密文为小写字母处理情况plaintext += (char) ((tempCiphertext - 97 - tempKey + 97 + 26) % 26 + 97);} else if (tempCiphertext >= 'A' && tempCiphertext <= 'Z') {// 密文为大写字母处理情况plaintext += (char) ((tempCiphertext - 65 - tempKey + 97 + 26) % 26 + 65);} else// 原文为其他字符时不改变plaintext += tempCiphertext;if (j >= key.length() - 1)j = -1;// 如果密钥结束,重复从密钥第一位继续加密}return plaintext;}}三、测试数据集:在本系统中破译的密文我设计的是从文本读入的,在本测试中文本存放在E 盘下,路径为"e:\\miwen.txt"。
By.zx实验内容:经典密码算法分析实践破解以下数据,并解析破解过程Mfwkrpltqqctixlcnrgemwhivjwoeenijkymnhmmqxhjnzssuwypfychjafmv jhpvrexjahtewqmnkujyqgpexzvqeyknvvwhnsoglrjjxbmnyxiuiaitnfict slcpahjloiionvtkutfvnjtjwjbxhxnlrwdwjeglenwnvraqrigghjxwsxhjx mnwosgmvnislkbylimiiisyttrrtmjbvxljkzbqgzfvtdhtzqsxhjfavenhmi ztitsauedqtagxhjnzzethmigwhfslbrgqzvrrgfslvjgztialaibwaetmtur egfnvfxsywctkljwauinfsrvendjmiirlwiahemflgsoajzpsmjfaperjfngi rqncomngnvbtesjlglexhwemnltvzmnzymfwpfwsvrghjtrfrfyqbrsfrwakt mjpbqexzxcsryjzfenifbnghnqtlaowpmewsyflvymnsjrmjnsojlessmjwok yprkofqnvptjwmqxhwtctlbzyjeeznqqnreqpmfsnqjdrpljibuishtzrnuxy jrjowjpnpfynurxohftzxhjsmezextngleknnnaowqlpypbnvamnlqqctifsl gekjmqfswsnvpveinjyigtftfgownvtxaqqgssrymmfiaxtvgsgtftfmnqjit yelfurwbjnrvrgrjiaahnqmqsmnsigidutafisxnwafuykivpeiywsmniyprr eyfonmnxyicpuhpguinfsavhebmwsmnnxpglexjifsntsmcpahjiosvjwmyig fymqhaqniaeewgqamtbfanrayyipoisllvwpqfgsvorgmvnisleushfixhwhj iohenlepbyaqqbuiwfdbuenpxbbetjwzvjihqigisjfabrszworahnhpfewym mzaisyprmrxjdrrpwjdvsuxrigghjxubwtwjkrrtqditeisxbympunazinnso henliwaklfxbjieplcnrgemwhpoxynbyrlfurwoajzglelfurwefxwaxhwjmz srjypnrisyprmrmnagsrnharestsjhxwnyprpkjxwasnknzrxhjdpnzeflivrbjjvsvejxkbvislvrxtnsotsaqxvvrertzrxhfsaiinltznrewnsfwosxohen lepbyrkbpbjisnauidymqehasiubveymiafenoqakhfwjvrynymakfnsqflei gwgxortnglehxtnrdbntyfewjtrkayjlnposlevxhiftvenxmiakhfnauinmz iglektzzirhqcosfsnkbpaxfvrpkffvqhiinmehrtljnjisnauidrnlgebqjq arisypcssnyqbr加密方法分析:使用Cryptographic Analysis Program的Freq工具,密文经过分析频率得到密文的英文字母频率表:下面列出的表格引自Algoritmy网站。
实验一古典密码-Vigernere算法实验-2022
一、实验目的
1、理解简单加密算法的原理;
2、掌握Vigenere密码的原理,完成Vigenere密码加解密程序的编写;
3、通过实验,加深对古典密码体制的了解,掌握对字符进行灵活处
理的方法。
二、实验预习提示
1、多表代换密码
多表代换密码是指以一系列(两个以上)代换表一次对明文消息空间
中的明文消息元素进行代换的加密方法。
如果代换序列为非周期的无限序列,即对每个明文字母都采用不同的代换表(或密钥)进行加密,则相应
的密码称为一次一密钥密码。
一次一密钥密码是理论上唯一不可破译的密码,可称为是无条件安全的。
如果一个密码体制被称为是无条件安全的,即是指即便提供无穷的计
算资源,密码分析者也无法攻破该密码体制。
如果一个密码体制被称为是
计算安全的,则是指密码分析者根据可利用的资源无法攻破该密码体制。
由于一次一密钥密码需要的密钥量和明文消息长度相同,因而难以广
泛使用。
为了减少密钥量,在实际应用中多采用周期多表代换密码,即代
换表个数有限,重复地使用。
典型的多表代换密码包括维吉尼亚(Vigenere)密码、博福特(Beaufort)密码、滚动密钥(running-key)密码、弗纳姆(Vernam)密码和转轮(rotormachine)密码等。
2、Vigenere密码概述
Vigenere密码译为维吉尼亚密码或维热纳尔密码,维吉尼亚密码曾
多次被发明。
该方法最早记录在吉奥万巴蒂斯塔贝拉索(GiovanBattitaBellao)于1553年所著的书《吉奥万巴蒂斯塔贝拉索先
生的密码》(意大利语:Lacifradel.Sig.GiovanBattitaBellao)中。
然而,后来在19世纪时被误传为是法国外交官布莱斯德维吉尼亚(BlaieDeVigenère)所创造,因此现在被称为“维吉尼亚密码”。
3、Vigenere密码
Vigenere密码是使用一系列恺撒密码组成密码字母表的加密算法,
属于多表密码的一种简单形式。
在一个恺撒密码中,字母表中的每一字母
都会作一定的偏移,而Vigenere密码则是由一些偏移量不同的恺撒密码
组成。
为了生成密码,需要使用表格法。
这一表格包括了26行字母表,
每一行都由前一行向左偏移一位得到,相当于将26个恺撒密表合成一个,如表2.2.1所示。
具体使用哪一行字母表进行编译是基于密钥进行的,在
过程中会不断地变换。
表2.2.1维吉尼亚密码表
例如,假设明文为:ATTACKATDAWN
选择某一关键词并重复而得到密钥,如关键词为LEMON时,密钥为:LEMONLEMONLE
对于明文的第一个字母A,对应密钥的第一个字母L,于是使用表格
中L行字母表进行加密,得到密文第一个字母L。
类似地,明文第二个字
母为T,在表格中使用对应的E行进行加密,得到密文第二个字母某。
以
此类推,可以得到:
明文:ATTACKATDAWN密钥:LEMONLEMONLE密文:L某FOPVEFRNHR
解密的过程则与加密相反。
例如:根据密钥第一个字母L所对应的L 行字母表,发现密文第一个字母L位于A列,因而明文第一个字母为A。
密钥第二个字母E对应E行字母表,而密文第二个字母某位于此行T列,因而明文第二个字母为T。
以此类推便可得到明文。
Vigenere密码是一种以移位代换为基础的周期代换密码,其加密变换为:
Eki(mi)=mi+ki=cimodN
解密变换为:
Dki(ci)=ci-ki=mimodN
其中,ki∈K是密钥,mi∈M是明文,ci∈C是密文,N为明文字母表的长度。
可见,Vigenere密码与实验一中的单表移位密码的区别仅仅在于:单表移位密码中的位移量k是一个固定的常数;而Vigenere密码中的ki 是变化的,字母的位置不同,则所采用的位移量也不同。
本实验通过编写一个简单的Vigenere密码加密和解密程序,了解加密和解密内部的过程和相关概念,更加深入地了解其原理,掌握Vigenere算法。
三、实验过程和指导(一)实验要求
根据Vigenere密码的原理编写程序,对输入的符号串能够根据设置的密钥分别正确实现Vigenere加密和解密功能。
(二)实验准备
1、阅读教材有关章节,理解简单加密算法的原理,掌握Vigenere密码的原理。
2、初步编制好程序。
3、准备好多组测试数据。
(三)上机实验
将编写好的源代码输入计算机并进行调试分析,发现错误,再修改完善,最终实现实验所要求的功能。
首先获取要加密或解密的内容以及使用的密钥,由于Vigenere密码是由一些偏移量不同的恺撒密码组成,因此需要将待加密或解密的内容中每个字符取出,然后针对每个字符分别加以移位处理。
主要步骤如下:
1、读取要加密或解密的字符串以及使用的密钥
为简单起见,程序中可通过命令行输入要加密或解密的字符串,以及加密和解密所使用的密钥。
2、取出要加密或解密的字符串中的每个字符取出每个字符,准备分别加以移位。
3、对每个字符进行移位处理
由于Vigenere密码是由一些偏移量不同的恺撒密码所组成的,因此与恺撒密码类似,在移位后可能发生超界,需要对出现超界的情况进行处理。
此外,由于大写字母和小写字母判断是否超界的依据不同,因此程序中应将字符分为大写和小写分别处理。
(五)注意事项
1、模块化设计:将程序分成合理的多个模块(函数),每个模块做具体的同一事情。
具体到本实验,可分别编写两个函数,分别实现Vigenere加密和解密功能;
2、注意养成良好的编程风格,如空行的使用、注释的使用、缩进的使用等。
(六)分析与思考
在完成Vigenere加密和解密基本功能的基础上,进一步扩展程序功能,实现对文件的Vigenere加密和解密功能。
四、实验提交材料
1、程序源代码;
2、测试数据;
Vigenere加密和解密的实验测试数据,解密测试数据包括输入密钥正确时正确解密所得到的原始明文信息,以及输入密钥错误时解密所得到的相关明文信息。
3、实验报告。
实验报告应包括以下内容:实验名称、实验目的、实验内容及要求、实验过程及结果、实验中的问题及心得。
实验格式参见“附录:实验报告样例”。
五、程序运行结果:1、Vigenere方阵
2、Vigenere加密
2、Vigenere解密
图2.2.1Vigenere方阵
图2.2.2Vigenere加密结果
图2.2.3Vigenere解密结果(输入正确密钥)
图2.2.4Vigenere解密结果(输入错误密钥)。