密码学实验

合集下载

密码学案例实验报告书

密码学案例实验报告书

一、实验背景随着信息技术的飞速发展,信息安全问题日益突出。

密码学作为保障信息安全的核心技术,在数据加密、身份认证、数字签名等领域发挥着重要作用。

为了加深对密码学原理的理解,提高实际应用能力,我们开展了本次密码学案例实验。

二、实验目的1. 掌握DES加密算法的基本原理和操作步骤。

2. 熟悉RSA加密算法的原理和应用。

3. 学习数字签名技术的应用。

4. 培养动手实践能力,提高解决实际问题的能力。

三、实验内容1. DES加密算法(1)实验目的:了解DES加密算法的基本原理,掌握DES加密和解密过程。

(2)实验内容:① 设计一个简单的DES加密程序,实现明文到密文的转换。

② 设计一个简单的DES解密程序,实现密文到明文的转换。

(3)实验步骤:① 编写DES加密程序,输入明文和密钥,输出密文。

② 编写DES解密程序,输入密文和密钥,输出明文。

2. RSA加密算法(1)实验目的:了解RSA加密算法的基本原理,掌握RSA加密和解密过程。

(2)实验内容:① 设计一个简单的RSA加密程序,实现明文到密文的转换。

② 设计一个简单的RSA解密程序,实现密文到明文的转换。

(3)实验步骤:① 编写RSA加密程序,输入明文和密钥对,输出密文。

② 编写RSA解密程序,输入密文和私钥,输出明文。

3. 数字签名技术(1)实验目的:了解数字签名技术的基本原理,掌握数字签名的生成和验证过程。

(2)实验内容:① 设计一个简单的数字签名程序,实现签名生成和验证。

(3)实验步骤:① 编写数字签名程序,输入明文、私钥和签名算法,输出签名。

② 编写数字签名验证程序,输入明文、公钥和签名,验证签名是否正确。

四、实验结果与分析1. DES加密算法实验结果通过编写DES加密和解密程序,成功实现了明文到密文和密文到明文的转换。

实验结果表明,DES加密算法在保证数据安全的同时,具有较高的效率。

2. RSA加密算法实验结果通过编写RSA加密和解密程序,成功实现了明文到密文和密文到明文的转换。

维吉尼亚密码学实验报告

维吉尼亚密码学实验报告

一、实验目的1. 理解维吉尼亚密码的原理和加密解密过程。

2. 掌握维吉尼亚密码的编程实现。

3. 破解维吉尼亚密码,提高密码学应用能力。

二、实验原理维吉尼亚密码是一种多表密码,它通过将明文与密钥进行组合,实现字符的替换加密。

加密过程中,密钥的长度决定了密钥表的大小,密钥表中的每一行对应一个密钥,加密时按照密钥表中的行进行替换。

解密过程则是加密过程的逆过程。

三、实验内容1. 维吉尼亚密码的加密与解密实现(1)加密① 创建密钥表:根据密钥长度生成密钥表,密钥表中每一行对应一个密钥,密钥长度等于明文长度。

② 对明文进行加密:将明文中的每个字符按照密钥表中的行进行替换,得到密文。

(2)解密① 创建密钥表:根据密钥长度生成密钥表。

② 对密文进行解密:将密文中的每个字符按照密钥表中的行进行替换,得到明文。

2. 维吉尼亚密码的破解(1)重合指数法① 计算密文的重合指数:将密文与英文常见单词的重合指数进行比较,选择重合指数最高的密钥长度。

② 遍历密钥长度:对于每个密钥长度,遍历26个可能的偏移量,计算重合指数,选择重合指数最高的偏移量。

③ 解密密文:根据密钥长度和偏移量,对密文进行解密,得到可能的明文。

(2)暴力破解法① 遍历密钥长度:遍历所有可能的密钥长度。

② 遍历密钥:对于每个密钥长度,遍历所有可能的密钥。

③ 解密密文:根据密钥长度和密钥,对密文进行解密,得到可能的明文。

四、实验步骤1. 创建密钥表根据密钥长度生成密钥表,密钥表中每一行对应一个密钥。

2. 加密明文将明文中的每个字符按照密钥表中的行进行替换,得到密文。

3. 解密密文将密文中的每个字符按照密钥表中的行进行替换,得到明文。

4. 破解密文(1)重合指数法① 计算密文的重合指数。

② 遍历密钥长度。

③ 遍历密钥。

④ 解密密文。

(2)暴力破解法① 遍历密钥长度。

② 遍历密钥。

③ 解密密文。

五、实验结果与分析1. 加密与解密实验结果表明,维吉尼亚密码的加密和解密过程能够正确实现,密文与明文能够成功还原。

现代密码算法实验报告(3篇)

现代密码算法实验报告(3篇)

第1篇一、实验目的1. 了解现代密码学的基本原理和数论基础知识;2. 掌握非对称密码体制的著名代表RSA加密算法的工作原理和流程;3. 设计实现一个简单的密钥系统;4. 掌握常用加密算法AES和DES的原理及实现。

二、实验内容1. RSA加密算法实验2. AES加密算法实验3. DES加密算法实验三、实验原理1. RSA加密算法RSA算法是一种非对称加密算法,由罗纳德·李维斯特、阿迪·沙米尔和伦纳德·阿德曼三位密码学家于1977年提出。

其基本原理是选择两个大质数p和q,计算它们的乘积n=pq,并计算欧拉函数φ(n)=(p-1)(q-1)。

选择一个整数e,满足1<e<φ(n)且e与φ(n)互质。

计算e关于φ(n)的模逆元d。

公开密钥为(e,n),私有密钥为(d,n)。

加密过程为C=Me mod n,解密过程为M=Cd mod n。

2. AES加密算法AES(Advanced Encryption Standard)是一种分组加密算法,采用128位分组大小和128、192或256位密钥长度。

AES算法主要分为四个阶段:初始轮、密钥扩展、中间轮和最终轮。

每个轮包括字节替换、行移位、列混淆和轮密钥加。

3. DES加密算法DES(Data Encryption Standard)是一种分组加密算法,采用64位分组大小和56位密钥长度。

DES算法主要分为16轮,每轮包括置换、置换-置换、S盒替换和密钥加。

四、实验步骤及内容1. RSA加密算法实验(1)选择两个大质数p和q,计算n=pq和φ(n)=(p-1)(q-1);(2)选择一个整数e,满足1<e<φ(n)且e与φ(n)互质,计算e关于φ(n)的模逆元d;(3)生成公开密钥(e,n)和私有密钥(d,n);(4)用公钥对明文进行加密,用私钥对密文进行解密。

2. AES加密算法实验(1)选择一个128、192或256位密钥;(2)初始化初始轮密钥;(3)进行16轮加密操作,包括字节替换、行移位、列混淆和轮密钥加;(4)输出加密后的密文。

《密码学》课程设计实验报告-分组密码DES2

《密码学》课程设计实验报告-分组密码DES2

《密码学》课程设计实验报告实验序号:02 实验项目名称:分组密码AES图:AES轮函数结构图:AES轮密钥产生2.AES 算法的基本运算(重点) 方法:通过编程代码实现下列运算:(1)8(2)GF 上的加法(教材 p83定义3-2) (为了描述方便,用花括号表示16进制,下同) 例:{BC }⊕{6A }={D6}(下图中的A 3,3⊕K 3,3=B 3,3)计算或编程方法:按位异或(提示——C 、Java 等语言中的^运算符) (2)8(2)GF 上的多项式加法(教材 p83定义3-7) 例:a(x)={BC}x 3+{42} x 2+{9F} x+{4C}K(x)= {6A}x 3+{00} x 2+{5C} x+{57} a(x) ⊕K(x)= {D6}x 3+{42} x 2+{C3} x+{1B}计算或编程方法:按位异或(提示——C 、Java 等语言中的^运算符)A 0,0A 0,1A 0,2A 0,3A 1,0A 1,1A 1,2A 1,3A 2,0A 2,1A 2,2A 2,3A 3,0A 3,1A 3,2A 3,3K 0,0K 0,1K 0,2K 0,3K 1,0K 1,1K 1,2K 1,3K 2,0K 2,1K 2,2K 2,3K 3,0K 3,1K 3,2K 3,3+B 0,0B 0,1B 0,2B 0,3B 1,0B 1,1B 1,2B 1,3B 2,0B 2,1B 2,2B 2,3B 3,0B 3,1B 3,2B 3,3A 3,3 ⊕K 3,3 =B 3,3 (mod 2)对于AES 中的轮密钥加运算,即可以表示为对应“字节”的加法,每格相加,即定义3-2;也可以表示为对应32位“字”的加法,每列相加,即定义3-7;甚至可以表示为整个128位“状态”的按位异或。

思考:在不同CPU 架构下,哪种表示方法的执行速度最快?(4)8(2)GF 上的多项式乘法(教材 p83定义3-8、p93优化方案) (a )AES 中的列混合运算的实现其中的运算按列(32位字)实现,当然也可表述为下面的4×4的字节矩阵相乘:大家手工计算时,按列进行表述较为简单:例如下面的列混合计算:其中的第一列运算步骤为:在GF(28)中,加法就是按位XOR操作,乘法是根据在上述方程所示的规则执行的。

经典密码学实验报告

经典密码学实验报告

一、实验目的1. 了解经典密码学的基本原理和算法;2. 掌握古典密码的加密和解密方法;3. 通过编程实现古典密码的加密和解密过程;4. 体验古典密码的破解过程,加深对密码学原理的理解。

二、实验环境1. 操作系统:Windows 102. 编程语言:Python3.73. 开发工具:PyCharm三、实验内容本次实验主要涉及以下几种古典密码:1. 仿射密码2. 单表代替密码3. 维吉尼亚密码4. 移位密码1. 仿射密码(1)原理简介:仿射密码是一种单字母替换密码,加密公式为:Ci = (a pi + b) mod 26,其中,Ci 为密文,pi 为明文,a 和 b 为密钥。

(2)加密和解密代码实现:```pythondef encrypt(plain_text, a, b):cipher_text = ''for char in plain_text:if char.isalpha():cipher_text += chr(((ord(char.upper()) - ord('A') + a b) % 26) + ord('A'))else:cipher_text += charreturn cipher_textdef decrypt(cipher_text, a, b):plain_text = ''for char in cipher_text:if char.isalpha():plain_text += chr(((ord(char.upper()) - ord('A') - a b) % 26) + ord('A'))else:plain_text += charreturn plain_text```2. 单表代替密码(1)原理简介:单表代替密码是一种将明文中的每个字符映射到密文的密码,加密和解密过程是相反的。

密码学实验报告

密码学实验报告

密码学实验报告中文汉字的密码化实验1. 实验简介本实验旨在通过对中文汉字的密码化实验,探究密码学在信息安全领域中的应用。

在本实验中,我们将使用替换密码技术对中文汉字进行加密和解密,并评估其安全性和实用性。

2. 实验步骤2.1 选择密钥在开始实验之前,我们需要选择一个密钥。

密钥是密码算法的关键,它用于对明文进行加密和解密。

在本实验中,我们选择一个包含所有中文汉字的密钥表。

该密钥表将用于替换明文中的汉字,从而实现密码化。

2.2 加密过程加密过程涉及将明文中的汉字替换为对应的密钥表中的汉字。

我们将使用一种称为替换密码的技术来实现加密。

具体步骤如下:步骤一:准备明文 - 选择一段中文汉字作为明文。

步骤二:选择密钥表 - 使用预先准备好的密钥表,其中包含了所有中文汉字的替换映射关系。

步骤三:替换汉字 - 将明文中的每个汉字根据密钥表中的映射进行替换。

步骤四:生成密文 - 将替换后的汉字按照顺序组成密文。

2.3 解密过程解密过程即将密文还原为明文。

在我们的实验中,解密过程与加密过程密切相关,因为它需要使用相同的密钥表进行替换。

具体步骤如下:步骤一:准备密文 - 选择加密过程生成的密文作为输入。

步骤二:选择密钥表 - 使用和加密过程相同的密钥表。

步骤三:替换汉字 - 将密文中的每个汉字根据密钥表中的映射进行替换。

步骤四:生成明文 - 将替换后的汉字按照顺序组成明文。

3. 实验结果与讨论在本实验中,我们选择了一段中文汉字作为明文,并使用已准备好的密钥表进行加密和解密操作。

经过多次实验,我们得到了一些实验结果和相应的讨论。

3.1 加密结果经过加密过程,我们得到了一段由密文组成的结果。

加密后的密文将替换明文中的汉字,使其具有一定的保密性。

然而,我们也发现了一些问题:问题一:密文长度增加 - 密文的长度通常会大于明文的长度,这可能导致在传输和存储过程中的一些问题。

问题二:密钥表可预测 - 由于我们使用了固定的密钥表,攻击者有可能通过分析密文和明文之间的关系来推断出密钥表的内容。

密码学实验报告

密码学实验报告信息安全实验报告学号:学生姓名:班级:实验三密码学实验一、古典密码算法实验一、实验目的通过编程实现替代密码算法和置换密码算法,加深对古典密码体制的了解,为深入学习密码学奠定基础。

二、编译环境运行windows 或linux 操作系统的PC 机,具有gcc、VC 等C语言编译环境。

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

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

下面介绍两种常见的具有代表性的古典密码算法,以帮助读者对密码算法建立一个初步的印象。

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

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

替代密码包括多种类型,如单表替代密码、多明码替代密码、多字母替代密码、多表替代密码等。

下面我们介绍一种典型的单表替代密码,恺撒密码,又叫循环移位密码。

它的加密方法,就是将明文中的每个字母用此字符在字母表中后面第k个字母替代。

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

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

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

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

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

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

密码学实验报告

密码学实验报告摘要:本实验旨在通过实践掌握基本密码学算法的原理和应用。

在本次实验中我们完成了Caesar密码、仿射密码、VIC密码和Hill密码的加密和解密过程,并进行了相应的分析和评价。

实验结果表明,不同的密码算法有各自的优缺点,应根据具体需求进行选择。

一、实验目的1.了解基本密码学算法的原理和应用。

2.通过实践掌握Caesar密码、仿射密码、VIC密码和Hill密码的加密和解密过程。

3.分析和评价各个密码算法的优缺点。

二、实验原理Caesar密码:是一种非常简单的单字母替换密码。

按照字母表上旋转的位置,每个字母都用它在字母表中的下一个字母替代。

仿射密码:通过将明文中的每个字母转换为另一个字母,实现加密。

明文中的每个字母通过使用一组固定的数学函数进行加密。

随机选择这些函数,并按正确的顺序应用它们。

VIC密码:将某些字母替换为其他字母组合的运算称为置换。

VIC密码使用10个钥匙,其中每个钥匙是一个置换。

通过使用不同的键,VIC密码可以很容易地产生四十亿多个不同的密码。

Hill密码:是一种基于线性代数理论的密码算法。

对于一个给定的矩阵α,Hill密码通过将明文划分为每个字母,然后将其与矩阵α乘法来加密,最后将结果映射回字母表中的字母。

三、实验过程1.实现Caesar密码的加密和解密。

2.实现仿射密码的加密和解密。

3.实现VIC密码的加密和解密。

4.实现Hill密码的加密和解密。

5.对各个密码算法进行分析和评价。

四、实验结果1.在Caesar密码中,明文是将每个字母按照一定的步长向右或向左移动来进行加密。

由于其简单性,Caesar密码的加密和解密都很容易,但安全性较低。

2.仿射密码是Caesar密码的扩展版本。

通过随机选择两个数字,仿射密码在加密的过程中使用模运算和线性函数组合对明文进行加密。

由于消息加密和解密都使用数学功能进行计算,因此密钥空间大于Caesar,也比较安全。

3.VIC密码使用多个置换键(通常为10),交替使用它们来完成加密和解密过程。

实验吧_密码学实验报告(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. 增强网络安全意识,提高对密码学在实际应用中的认识。

二、实验内容1. 仿射密码2. 单表代替密码3. 维吉尼亚密码4. AES加密算法三、实验原理1. 仿射密码:加密原理为将明文进行0~25字母编码,按照加密公式计算出密文对应位置的字母编码,最后从密文的字母编码还原出密文对应位置的字母。

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

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

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

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

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

4. AES加密算法:是一种分组加密算法,将128位明文分为128位的数据块,使用密钥进行加密,得到128位的密文。

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

四、实验步骤1. 仿射密码(1)选择明文:选择一段英文或数字,例如:"Hello World!"(2)选择密钥:选择一个密钥a和模数m,例如:a=5,m=26。

(3)加密:将明文进行0~25字母编码,按照加密公式计算出密文对应位置的字母编码,最后从密文的字母编码还原出密文对应位置的字母。

(4)解密:将密文进行0~25字母编码,按照解密公式计算出明文对应位置的字母编码,最后从明文的字母编码还原出明文对应位置的字母。

2. 单表代替密码(1)构造代替表:选择一个代替表,将明文中的每个字符映射到密文。

(2)加密:将明文中的每个字符按照代替表进行映射,得到密文。

(3)解密:将密文中的每个字符按照代替表的逆映射,得到明文。

3. 维吉尼亚密码(1)选择密钥:选择一个密钥,例如:"KEY"(2)加密:将明文和密钥进行异或操作,得到密文。

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

实验一两种基本古典密码设计与实现一、实验目的:通过本实验,使得我们对两种基本的古典密码编码方法(代替密码和换位移位密码)产生深刻的认识,清楚理解二者之间的本质差异,为理解和掌握现代密码的相应知识打下良好基础。

二、实验内容:(一)设计一个周期为3的多表代替密码并予以实现。

要求:1、该多表代替密码的编程实现,须能对下面一段明文进行正确加密(空格和标点符号保持不动):Q is a symmetric block cipher. It is defined for a block size of 128 bits. It allows arbitrary length passwords. The design is fairly conservative. It consistsof a simple substitution-permutation network. In this paper we present thecipher, its design criteria and our analysis. The design is based on both Rjindaeland Serpent. It uses an 8-bit s-box from Rjindael with the linear mixing layersreplaced with two Serpent style bit-slice s-boxes and a linear permutation. Thecombination of methods eliminates the high level structure inherent in Rjindaelwhile having better speed and avalanche characteristics than Serpent. Speedis improved over Serpent. This version 2.00 contains better analysis, editorialchanges, and an improved key scheduling algorithm. The number ofrecommended rounds is also increased.2、实验方法要求:(1)第1个表由密钥字法产生(密钥字自拟);(2)第2个表由洗牌法产生(注意字母a~z与数字0~25一一对应);洗牌法(n=25)):从一个随机文件读取n+1字节数据d0, d1, , d n,由预先取定的一个0~n的全排列P(比如,可为0~n的自然排列)开始,依次对i=n, n-1, , 1,计算:j=d i-1+d i (mod i)交换P的第i项第j项(在此注意我们假定P从第0项开始)。

(3)第三个表由公式法产生(数学公式自拟,注意它须是Z26上的一个一一变换)。

3、抓图显示密文(附页),不能出现明显错误。

(二)设计一个周期为5的16-置换移位密码并予以实现。

要求:1、该周期为5的16-置换移位密码的编程实现,须能对(一)中相同明文进行正确加密(空格和标点符号保持不动):2、5个16-置换至少有一个是自行设计的方法产生,其他方法可参照以下进行。

方法一(洗牌法):见上述介绍,此时n取16;方法二:用一个随机函数产生m(m>n)字节数据d1, d2, , d m。

对d1(mod(n+1)), d2(mod (n+1)), , d m(mod (n+1))依次考察,把后面出现的与前相同者去掉;在最后剩下的数据中,把没有出现的0~n依序补写于后面。

3、抓图显示密文(附页),不能出现明显错误。

三、实验步骤:(包含各个函数的流程图)(一)设计一个周期为3的多表代替密码这个程序设计的关键就在于三个密钥表的设计、打开待加密文件的设计和文件加密过程的设计(也就是主函数部分)(1)密钥字法产生第一个密文字母表输入一个密钥字keyword[26],把每一个字母赋给一个数组,去掉相同的字母,同时设另一个全0数组,将这个数组里面下标和已出现过的字母在明文字母表里面的下标一样的元素置成1,然后通过该数组判断,把明文字母表里面没有出现过得字母按顺序往后面排。

通过以下代码将产生的密文字母表保存在P1[]数组while(keyword[i]!='\0'){P1[j++]=(int)keyword[i++]-'a';//强制转换类型if(A[keyword[i-1]-'a']=='%') j--;else A[keyword[i-1]-'a']='%';}for(i=0;i<=25;i++){if(A[i]!='%') P1[j++]=i;}(2)用洗牌法产生第二个密文字母表通过语句srand((unsigned)time(0));和P2[j++]=(unsigned long int)(rand()%26);产生随机数,根据明文字母表里面字母的下标把全排列中数字对应的字母赋给一个数组,即:for(i=0;i<=26;i++){if(B[i]!='%') P2[j++]=i; } 从而得到密文字母表。

(3)用多项式法产生第三个密文字母表由用户自己随意设一个公式,如:(5*i+13)%26,通过输入变量值得到表达式的值,然后将明文字母表里面每一个字母往后移(5*i+13)%26位,然后在把得到的密文字母表作为返回值返回。

(4)打开待加密文件部分:这部分程序是根据网上的程序改写的,由于之前学习C++的时候没有学好文件流的相关知识,因此只能从网上拷贝。

start:printf("\n 请输入待加密文本文件名(扩展名为TXT):\n");scanf("%s",filename);if( (fp=fopen(filename,"rt"))==NULL ){printf("没有找到文件:%s\n",filename);goto start;}while((c=fgetc(fp))!=EOF){m[i++]=c; }return m;fclose(fp);(5)主函数部分:使用whlie语句,从第一个字母开始,先判断是否是字母,若是小写字母直接用第一个表加密,再判断下一个字母,如果也是小写字母就用第二个表加密,再判断下一个字母,若还是小写就用第三个表加密,判断下一个,还是小写就回到第一个表,以此类推。

若碰到大写字母,就先把它转换成小写,加密完后再转成大写输出来。

若碰到标点符号或空格就直接把它输出来,判断下一个但是还是用当前的表加密,不是用下一个表。

流程图如下:综上设计,完成整个程序,代码见附录。

运行结果如下:(二)设计一个周期为5的16-置换移位密码并予以实现。

这个程序的设计是基于上一个多表代替程序实现的,主要的程序设计部分就是五个密码表的设计和主函数加密实现部分,我沿用了上一个程序的三种方法来生成五个密码表,因此这个程序的设计较上一个简单很多(1)用洗牌法产生密码表通过语句srand((unsigned)time(0));和P2[j++]=(unsigned long int)(rand()%26);产生随机数,根据明文字母表里面字母的下标把全排列中数字对应的字母赋给一个数组,从而得到密码表。

(2)用多项式法产生密码表由用户自己随意设一个公式,如:(5*i+13)%26,通过输入变量值得到表达式的值,然后将明文字母表里面每一个字母往后移(5*i+13)%26位然后在把得到的密文字母表作为返回值返回。

(3)密钥字法产生密码表输入一个密钥字keyword[26],把每一个字母赋给一个数组,去掉相同的字母,同时设另一个全0数组,将这个数组里面下标和已出现过的字母在明文字母表里面的下标一样的元素置成1,然后通过该数组判断,把明文字母表里面没有出现过得字母按顺序往后面排。

(4)打开待加密文件部分:这部分程序同设计多表代替密码中的程序完全相同。

(5)主函数部分:先是看明文总长度能不能被16整除,若不能就在后面不x,使它的长度能被十六整除。

然后从第一个字母开始用两层循环,每十六字一组按顺序用五个随机全排列进行移位加密。

运用密钥表 P[j]加密明文字母m[i]的实现语句:c[i]=m[P[j][(i%16)]+k];并且通过j=(j+1)%5选择加密的密钥表流程图如下:接下页综上,可完成程序设计,代码见附录。

其运行结果如下:四、实验体会:这次实验由于课前准备不够充分,使得程序完成不够理想,大部分程序都是由给出的程序改写的,除了主函数部分,没有太多自己的思路。

当然收获也很多,首先将之前自己没有学到的文件流方面的知识点进行了恶补,大致上了解掌握了如何打开一个指定文件、如何从中读取信息、如何将信息复制。

其次,进一步深刻体会到了代替密码和移位密码的本质区别,为理解古典密码以及之后学习现代密码打下了基础。

最后,在编写过程中,我的随机数的产生方法是借用上学期我们保密管理课程的一次实验的代码,课后咨询同学,自己琢磨,发现还有一种更好的随机数的产生方式,能实现产生2到n-1的随机数。

其代码如下:#include<stdio.h>#include<math.h>unsigned char *full_array2(int n){int i;static unsigned char P[256],t[256];for(i=2;i<n;i++)P[i]=i;for(i=2;i<n;i++)t[i]=int(pow(P[i],3))%15; //p[i]过大不是int型就出错for(i=2;i<n;i++)printf("%d ",t[i]);return(t);}void main(){printf("产生的随机数为: \n");*full_array2(15);}运行结果如下:附录:代替密码:#include <stdio.h>#include<stdlib.h>#include <time.h>#include<string.h>unsigned int *list1()//由密钥字法产生第一个表{int i=0,j=0;//将i、j赋初值0,用于后面循环中static unsigned int P1[26];char A[26];char keyword[26];//密钥字keyword[0]='\0';start:printf("请输入一个单词作为密钥字:");scanf("%s",keyword);if (keyword[0]=='\0')goto start;//使用goto语句返回到指定位置while(keyword[i]!='\0'){P1[j++]=(int)keyword[i++]-'a';//强制转换类型if(A[keyword[i-1]-'a']=='%')j--;elseA[keyword[i-1]-'a']='%';}for(i=0;i<=25;i++){if(A[i]!='%')P1[j++]=i;}return P1;//返回数组P1[],即密钥字法产生的密钥表}unsigned int *list2()//由洗牌法产生第二个表{static unsigned int P2[26];char B[26]={0};int i,j=0;srand((unsigned)time(0));for(i=0;i<78;i++){P2[j++]=(unsigned long int)(rand()%26);//产生随机数if(B[P2[j-1]]!='%')B[P2[j-1]]='%';elsej--;}for(i=0;i<=26;i++){if(B[i]!='%')P2[j++]=i;}return P2;//返回数组P2[],即洗牌法产生的密钥表}unsigned int *list3()//由公式法产生第三个表{static unsigned int P3[26];int i;for(i=0;i<26;i++){P3[i]=(5*i+13)%26;}return P3;//返回数组P3[],即公式法产生的密钥表}void get(unsigned int p[26],unsigned int q[26])/*将list1()、list2()、list3()所产生的密钥表复制到另一个二维数组中*/{int i;for(i=0;i<26;i++){p[i]=q[i];}}void priarray(unsigned int arr[]){int i;for(i=0;i<=25;i++)printf(" %c",arr[i]+'a');}char *read()//读取待加密文件的内容{int i=0;static char m[1000];FILE *fp;char filename[20],c;//filename[20]用于保存用户输入的文件名start:printf("\n 请输入待加密文本文件名(扩展名为TXT):\n");scanf("%s",filename);if( (fp=fopen(filename,"rt"))==NULL ){printf("没有找到文件:%s\n",filename);goto start;/*没有找到输入的文件则使用goto语句返回到指定语句重新输入文件名*/}while((c=fgetc(fp))!=EOF){m[i++]=c;}return m;/*read()函数返回是数组m[],该数组中存有文件中的明文字母*/fclose(fp);//关闭文件}void main(){char m[1000];strcpy(m,read());//将文件中的明文字母全部复制到数组m[]中char c[1000];//将加密后的密文存在数组c[]中int i=0,j=0;unsigned int P[3][26]={0};//赋初值,该二维数组用于保存三个密钥表get(P[0],list1());get(P[1],list2());get(P[2],list3());printf("密钥字法密钥表:");priarray(P[0]);//输出list1()产生的密钥表printf("\n洗牌法密钥表:");priarray(P[1]);//输出list2()产生的密钥表printf("\n多项式法密钥表:");priarray(P[2]);//输出list3()产生的密钥表while (m[i]!='\0'){if((m[i]>='a')&&(m[i]<='z')){c[i]=((m[i]-'a')+P[j][m[i]-'a'])%26+'a';/*运用密钥表P[j]加密明文字母m[i]*/j=(j+1)%3;//通过j=(j+1)%3选择加密的密钥表}else if(((m[i]>='A')&&(m[i]<='Z'))){c[i]=((m[i]-'A')+P[j][m[i]-'A'])%26+'A';j=(j+1)%3;}else c[i]=m[i];i=i+1;}c[i]='\0';printf("\n文本文档中原文为:\n");puts(m);//输出文本文档中明文printf("\n加密后密文为:\n");puts(c);//输出加密后的密文}移位密码:#include<stdio.h>#include<stdlib.h>#include<time.h>#include<string.h>#include<windows.h>char *read()//读取待加密文件的内容{int i=0;static char m[1000];FILE *fp;char filename[20],c;//filename[20]用于保存用户输入的文件名start:printf("\n 请输入待加密文本文件名(扩展名为TXT):\n");scanf("%s",filename);if( (fp=fopen(filename,"rt"))==NULL ){printf("没有找到文件:%s\n",filename);goto start;/*没有找到输入的文件则使用goto语句返回到指定语句重新输入文件名*/}while((c=fgetc(fp))!=EOF){m[i++]=c;}return m;/*read()函数返回是数组m[],该数组中存有文件中的明文字母*/ fclose(fp);//关闭文件}void list1(unsigned int P[16])//洗牌法产生密码表{char Q[16]={0};int i,l=0;time_t t(0);srand((unsigned)time(&t));for(i=0;i<48;i++){P[l++]=(unsigned int)(rand()%16);if(Q[P[l-1]]!='%')Q[P[l-1]]='%';else l--;}for(i=0;i<16;i++){if(Q[i]!='%')P[l++]=i;}}void list2(unsigned int P[16])//多项式法产生密码表{int i;for(i=0;i<16;i++){P[i]=(5*i+13)%16;}}void list3(unsigned int P[16])//多项式法产生密码表{int i;for(i=0;i<16;i++){P[i]=(19*i+3)%16;}}void list4( unsigned int P[16])//由密钥字法产生密码表{int i=0,j=0;//将i、j赋初值0,用于后面循环中char A[26];char keyword[26];//密钥字keyword[0]='\0';start:printf("请输入一个单词作为密钥字:");scanf("%s",keyword);if (keyword[0]=='\0')goto start;//使用goto语句返回到指定位置while(keyword[i]!='\0'){P[j++]=(int)keyword[i++]-'a';//强制转换类型if(A[keyword[i-1]-'a']=='%')j--;elseA[keyword[i-1]-'a']='%';}for(i=0;i<=25;i++){if(A[i]!='%')P[j++]=i;}}void priarray(unsigned int arr[]){int i=0;for(;i<16;i++)printf("%3d",arr[i]+1);}void main(){char m[1000]={0};strcpy(m,read());//将文件中的明文字母全部复制到数组m[]中char c[1000];//将加密后的密文存在数组c[]中int i=0,t=0,j=0,k=0;unsigned int P[5][16];//赋初值,该二维数组用于保存五个密钥表list1(P[0]);//第一个密码表list2(P[1]);//第二个密码表list3(P[2]);//第三个密码表list4(P[3]);//第四个密码表list1(P[4]);//第五个密码表printf("五个密码表如下输出:");printf("\n第一个密码表(洗牌法生成):");priarray(P[0]);printf("\n第二个密码表(多项式法生成):");priarray(P[1]);printf("\n第三个密码表(多项式法生成):");priarray(P[2]);printf("\n第四个密码表(密钥字法生成):");priarray(P[3]);printf("\n第五个密码表(洗牌法生成):");priarray(P[4]);while (m[i]!='\0'){if(m[i+15]!='\0'){for(t=0;t<16;t++,i++)c[i]=m[P[j][(i%16)]+k];/*运用密钥表P[j]加密明文字母m[i]*/j=(j+1)%5;//通过j=(j+1)%5选择加密的密钥表k=i;}else{for(t=1;t<=15;t++)(m[i+t]=='\0'if(m[i+t]=='\0')m[i+t]='i';m[i+16]='\0';}}c[i]='\0';printf("\n文本文档中明文为:\n");puts(m);//输出文本文档中明文printf("\n加密后的密文为:\n");puts(c);//输出加密后的密文}。

相关文档
最新文档