密码学实验报告

合集下载

密码学实验第四组实验报告

密码学实验第四组实验报告

云南大学数学与统计学实验教学中心实验报告一、实验目的:1.熟悉McEliece码的设计原理;2.编程实现编码和译码算法;二、实验内容:实现McEliece公钥密码体制,并以(7,4)Hamming码为例进行测试。

三、实验环境Win7 Java四、实验过程(请学生认真填写):1. 预备知识:McEliece密码体制是是一种基于一个二进制线性码寻找最近码字的困难性的密码体制,McEliece建议采用一个[1024,512,101]Goppa码,但是任何具备良好译码特性的线性编码都是可以使用的。

这里由于对Goppa码不熟悉,选择了Hamming码来实现McEliece密码体制。

2. 实验过程A、原理分析:具体协议如下:Bob选择G—(n,k)线性纠错码C的生成矩阵(最大纠错能力为d),S—模2意义下k ×k可逆矩阵,P—n×n置换矩阵,计算G1= SGP,公开公钥G1,对私钥(S,G,P)保密。

Alice试图给Bob发送消息x,首先随机产生噪声e (长度为n,重量为t),再利用公钥对x进行加密:y = xG1+ e,将y发送给BobBob解密消息:计算y1= yP-1,再通过线性纠错码C的校验矩阵来得到y1的最近码字x1。

通过计算得到x0,使得x0×G=x1,通常直接取x1前k个Bits做为x0。

计算x=x0S-1,解密完成,得到原始消息。

B、具体代码较多,放在最后源代码部分实验中关于求行列式的值,矩阵乘积,矩阵求逆,Hamming码校验矩阵和生成矩阵相关函数,都是在以前实验课基础上加以修改后使用的。

实验结果:分析:由于Hamming码纠错能力有限,只能正确纠正一个比特位置上的错误,所以这次试验只是用来模拟McEliece公钥密码体制的相关过程,不具有实用性。

并且查阅资料以后,对McEliece有了更多了解。

虽然比较简单容易实现,但也存在不容忽视的弊端,比如1)公钥G1的密钥空间太大。

凯撒密码实验报告册(3篇)

凯撒密码实验报告册(3篇)

第1篇一、实验背景凯撒密码是一种古老的加密技术,由罗马皇帝凯撒发明。

它是一种替换加密,通过将明文字母表中的字母按照一个固定的偏移量进行替换,生成密文。

凯撒密码是最简单、最广为人知的加密技术之一,其加密和解密过程都非常简单。

二、实验目的1. 理解凯撒密码的加密和解密原理;2. 掌握凯撒密码的编程实现;3. 分析凯撒密码的安全性,了解其局限性;4. 比较凯撒密码与其他加密算法的差异。

三、实验环境1. 操作系统:Windows 102. 编程语言:Python3.83. 开发工具:PyCharm四、实验内容1. 凯撒密码加密和解密算法实现2. 凯撒密码安全性分析3. 凯撒密码与其他加密算法的比较五、实验步骤1. 凯撒密码加密和解密算法实现(1)定义凯撒密码加密和解密函数```pythondef caesar_encrypt(text, shift):encrypted_text = ""for char in text:if char.isalpha():shifted = ord(char) + shiftif char.isupper():if shifted > ord('Z'):shifted -= 26elif char.islower():if shifted > ord('z'):shifted -= 26encrypted_text += chr(shifted) else:encrypted_text += charreturn encrypted_textdef caesar_decrypt(text, shift):decrypted_text = ""for char in text:if char.isalpha():shifted = ord(char) - shiftif char.isupper():if shifted < ord('A'):shifted += 26elif char.islower():if shifted < ord('a'):shifted += 26decrypted_text += chr(shifted)else:decrypted_text += charreturn decrypted_text```(2)测试凯撒密码加密和解密函数```pythonif __name__ == "__main__":text = "Hello, World!"shift = 3encrypted_text = caesar_encrypt(text, shift)decrypted_text = caesar_decrypt(encrypted_text, shift)print("Original text:", text)print("Encrypted text:", encrypted_text)print("Decrypted text:", decrypted_text)```2. 凯撒密码安全性分析凯撒密码的安全性非常低,因为其密钥空间只有26个可能的值(即字母表中的字母数量)。

凯撒加密实验报告(3篇)

凯撒加密实验报告(3篇)

第1篇一、实验目的通过本次实验,掌握凯撒加密法的原理和步骤,了解其在密码学中的应用,并能够使用Python语言实现凯撒加密和解密功能。

二、实验原理凯撒加密法是一种最简单且最广为人知的替换加密技术。

其基本原理是将明文中的每个字母按照字母表的顺序向后(或向前)移动一个固定数目的位置,从而生成密文。

例如,当偏移量为3时,明文中的A将变成D,B变成E,以此类推。

凯撒加密法的密钥是偏移量,它决定了加密过程中字母的移动方向和距离。

密钥的取值范围是1到25,表示将字母表向后移动1到25个位置。

三、实验内容1. 凯撒加密使用Python语言实现凯撒加密功能,具体步骤如下:- 定义一个函数,接收明文和密钥作为参数。

- 将明文中的每个字母按照字母表的顺序向后移动密钥指定的位置。

- 对于超出字母表范围的字母,将其转换回字母表的首部。

- 返回加密后的密文。

2. 凯撒解密使用Python语言实现凯撒解密功能,具体步骤如下:- 定义一个函数,接收密文和密钥作为参数。

- 将密文中的每个字母按照字母表的顺序向前移动密钥指定的位置。

- 对于超出字母表范围的字母,将其转换回字母表的首部。

- 返回解密后的明文。

3. 实验演示使用实验代码演示凯撒加密和解密过程,包括以下示例:- 示例1:明文为“The quick brown fox jumps over the lazy dog”,密钥为3,加密后的密文为“Wkh txlfn eurzq ira mxpsv ryhu wkh odcb grj”。

- 示例2:密文为“Wkh txlfn eurzq ira mxpsv ryhu wkh odcb grj”,密钥为3,解密后的明文为“The quick brown fox jumps over the lazy dog”。

四、实验结果与分析1. 加密效果通过实验验证,凯撒加密法能够有效地将明文转换为密文,且解密过程也能够将密文恢复为明文。

古典密码的实验报告

古典密码的实验报告

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

现代密码算法实验报告(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)输出加密后的密文。

经典密码学实验报告

经典密码学实验报告

一、实验目的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)原理简介:单表代替密码是一种将明文中的每个字符映射到密文的密码,加密和解密过程是相反的。

实验吧_密码学实验报告(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)测试加密和解密函数,验证其正确性。

《密码学》课程设计实验报告-分组密码工作模式

《密码学》课程设计实验报告-分组密码工作模式

《密码学》课程设计实验报告实验序号:03 实验项目名称:分组密码工作模式分组工作模式具体说明➢电话本模式⏹直接利用分组密码对明文的各分组进行加密⏹缺点1.不能解决短块问题2.容易暴露明文的数据模式。

在计算机系统中,许多数据都具有某种固有的模式,这主要是由数据冗余和数据结构引起的。

例如,各种计算机语言的语句和指令都十分有限,因为在程序中便表现为少量的语句和指令的大量重复⏹流程图➢明密文链接模式⏹设明文M=(M1,⋯,M n),相应的密文C=(C1,⋯,C n)C i={E(M i⊕Z,K), i=1E(M i⊕M i−1⊕C i−1,K), i=2,⋯,n⏹特点1.加解密错误传播无界2.无法处理短块⏹流程图➢密文链接模式⏹由于明密文链接模式具有加解密错误传播无界的特性,而磁盘等文件通常希望错误传播有界,这时可采用密文链接模式⏹设明文M=(M1,⋯,M n),相应的密文C=(C1,⋯,C n)C i={E(M i⊕Z,K), i=1E(M i⊕C i−1,K), i=2,⋯,n⏹特点1.无法处理短块2.加密错误传播无界,解密错误传播有界➢输出反馈模式⏹将一个分组密码转换为一个密钥序列产生器,从而可以实现用分组密码按流密码的方式进行加解密。

⏹特点1.工作模式的安全性取决于分组密码本身的安全性2.可以解决短块加密3.无错误传播4.适用于加密冗余度较大的数据,例如语音和图像数据⏹流程图➢密文反馈模式⏹与输出反馈的工作原理基本相同,所不同的仅仅是反馈到移位寄存器R的不是E输出中的最右s位,而是密文c i的s位⏹流程图➢X CBC模式⏹X CBC模式解决了CBC模式要求明文数据的长度是密码分组长度的整数倍的限制,可以处理任意长的数据⏹优点1.可以处理任意长度的数据2.适用于计算产生检测数据完整性的消息认证码MAC⏹缺点1.使用3个密钥,密钥的存储和加解密控制都比较麻烦2.接受双方需要共享填充的消息长度➢CTR模式⏹与密文反馈工作模式和输出反馈工作模式一样,把分组密码转换为序列密码,在本质上是利用分组密码产生密钥序列,按序列密码的方式进行加密⏹优点1.可并行,效率高2.适合任意长度的数据3.加解密速度快⏹缺点1.没有错误传播,不适用于数据完整性验证⏹流程图五、分析与讨论1)分组密码不同的工作模式各有各的特点,例如有些工作模式需要处理短块,有些则不需要;有些模式具有错误传播无界的特性,有些则没有。

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

密码学实验报告学院:计算机科学与技术班级:学号:姓名:指导老师:密码学 实验日志实验题目:DES (或AES )分组密码实验目的:熟悉分组密码加解密算法的基本原理,加深对所提供的部分源程序的理解;分组密码将明文分成一组一组,在密钥的控制下,经过加密变换生成一组一组的密文。

具体而言,分组密码就是将明文消息序列 ,,,,21i m m m 划分成等长的消息组),,,,(),,,,(22121n n n n m m m m m m ++在密钥t k k k k ,,,21 =的控制下按固定的加密算法一组一组进行加密,输出一组一组密文 ),,,,(),,,,(22121l l l l c c c c c c ++。

下面的实验以DES 算法为例,DES 算法明文分组长为64bit ,加密后得到64bit 的密文,输入初始种子密钥为64bit ,第8、16、24、32、40、48、56、64为奇偶校验位,实际的密钥长为56bit 。

DES 加密过程由三个阶段来完成:(1) 初始置换IP ,用于重排明文分组的64bit 数据;(2) 相同结构的16轮迭代,每轮中都有置换和代换运算,第16轮变换的输出分为左右两半,并交换次序。

(3) 逆初始置换IP -1(为IP 的逆)后,产生64bit 的密文。

实验要求:(1) Windows 系列操作系统;(2) VC6.0编程环境。

(3) 提交完整的程序代码清单和详细的注释;(4) 要求有程序运行结果显示。

当加密成功时,得到密文;输入相同的密钥,能将密文恢复成明文。

实验主要步骤:(1) 熟悉分组密码加解密算法的基本原理,加深对所提供的部分源程序的理解;(2) 分析源程序中密码算法的加解密和子密钥生成等典型模块的主要功能,并对源程序加上注释;(3) 在已提供的部分源程序的基础上,添加源程序省缺的部分;(4) 对给定的消息分组进行加解密运算和验证。

源代码:#include <stdio.h>#include <memory.h>#include <string.h>typedef bool (*PSubKey)[16][48];enum {ENCRYPT,DECRYPT}; //选择:加密;解密static bool SubKey[2][16][48]; // 16圈子密钥static bool Is3DES; // 3次DES 标志static char Tmp[256], deskey[16]; //暂存字符串,密钥串static void DES(char Out[8], char In[8], const PSubKey pSubKey, bool Type);//标准DES加/解密static void SetKey(const char* Key, int len);// 设置密钥static void SetSubKey(PSubKey pSubKey, const char Key[8]);// 设置子密钥static void F_func(bool In[32], const bool Ki[48]);// f 函数static void S_func(bool Out[32], const bool In[48]);// S 盒代替static void Transform(bool *Out, bool *In, const char *Table, int len);// 变换static void Xor(bool *InA, const bool *InB, int len);// 异或static void RotateL(bool *In, int len, int loop);// 循环左移static void ByteToBit(bool *Out, const char *In, int bits);// 字节组转换成位组static void BitToByte(char *Out, const bool *In, int bits);// 位组转换成字节组// Type(选择)—ENCRYPT:加密,DECRYPT:解密// 输出缓冲区(Out)的长度>= ((datalen+7)/8)*8,即比datalen大的且是8的倍数的最小正整数// In 可以= Out,此时加/解密后将覆盖输入缓冲区(In)的内容// 当keylen>8时系统自动使用3次DES加/解密,否则使用标准DES加/解密.超过16字节后只取前16字节//加密解密函数:bool DES_Act(char *Out,char *In,long datalen,const char *Key,int keylen,bool Type = ENCRYPT);void main(){char plain_text[100]; // 设置明文char key[100] ; // 密钥设置printf("请输入明文:\n");gets(plain_text);printf("\n 请输入密钥:\n");gets(key);char encrypt_text[255]; // 密文char decrypt_text[255]; // 解密文memset(encrypt_text,0,sizeof(encrypt_text));memset(decrypt_text,0,sizeof(decrypt_text));// 进行DES加密:DES_Act(encrypt_text, plain_text, sizeof(plain_text), key, sizeof(key), ENCRYPT);printf("\nDES加密后的密文:\n");printf("%s\n\n",encrypt_text);// 进行DES解密:DES_Act(decrypt_text, encrypt_text, sizeof(plain_text), key, sizeof(key), DECRYPT);printf("\n解密后的输出:\n");printf("%s",decrypt_text);printf("\n\n");getchar();}//下面是DES算法中用到的各种表:// 初始置换IP表const static char IP_Table[64] ={58, 50, 42, 34, 26, 18, 10, 2, 60, 52, 44, 36, 28, 20, 12, 4,62, 54, 46, 38, 30, 22, 14, 6, 64, 56, 48, 40, 32, 24, 16, 8,57, 49, 41, 33, 25, 17, 9, 1, 59, 51, 43, 35, 27, 19, 11, 3,61, 53, 45, 37, 29, 21, 13, 5, 63, 55, 47, 39, 31, 23, 15, 7};// 逆初始置换IP1表const static char IP1_Table[64] ={40, 8, 48, 16, 56, 24, 64, 32, 39, 7, 47, 15, 55, 23, 63, 31,38, 6, 46, 14, 54, 22, 62, 30, 37, 5, 45, 13, 53, 21, 61, 29,36, 4, 44, 12, 52, 20, 60, 28, 35, 3, 43, 11, 51, 19, 59, 27,34, 2, 42, 10, 50, 18, 58, 26, 33, 1, 41, 9, 49, 17, 57, 25};// 扩展置换E表static const char Extension_Table[48] ={32, 1, 2, 3, 4, 5, 4, 5, 6, 7, 8, 9,8, 9, 10, 11, 12, 13, 12, 13, 14, 15, 16, 17,16, 17, 18, 19, 20, 21, 20, 21, 22, 23, 24, 25,24, 25, 26, 27, 28, 29, 28, 29, 30, 31, 32, 1};// P盒置换表const static char P_Table[32] ={16, 7, 20, 21, 29, 12, 28, 17, 1, 15, 23, 26, 5, 18, 31, 10,2, 8, 24, 14, 32, 27, 3, 9, 19, 13, 30, 6, 22, 11, 4, 25};// 密钥置换表const static char PC1_Table[56] ={57, 49, 41, 33, 25, 17, 9, 1, 58, 50, 42, 34, 26, 18,10, 2, 59, 51, 43, 35, 27, 19, 11, 3, 60, 52, 44, 36,63, 55, 47, 39, 31, 23, 15, 7, 62, 54, 46, 38, 30, 22,14, 6, 61, 53, 45, 37, 29, 21, 13, 5, 28, 20, 12, 4};// 压缩置换表const static char PC2_Table[48] ={14, 17, 11, 24, 1, 5, 3, 28, 15, 6, 21, 10,23, 19, 12, 4, 26, 8, 16, 7, 27, 20, 13, 2,41, 52, 31, 37, 47, 55, 30, 40, 51, 45, 33, 48,44, 49, 39, 56, 34, 53, 46, 42, 50, 36, 29, 32};// 每轮移动的位数const static char LOOP_Table[16] ={1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1};// S盒设计const static char S_Box[8][4][16] ={// S盒114, 4, 13, 1, 2, 15, 11, 8, 3, 10, 6, 12, 5, 9, 0, 7, 0, 15, 7, 4, 14, 2, 13, 1, 10, 6, 12, 11, 9, 5, 3, 8,4, 1, 14, 8, 13, 6, 2, 11, 15, 12, 9, 7, 3, 10, 5, 0,15, 12, 8, 2, 4, 9, 1, 7, 5, 11, 3, 14, 10, 0, 6, 13,// S盒215, 1, 8, 14, 6, 11, 3, 4, 9, 7, 2, 13, 12, 0, 5, 10,3, 13, 4, 7, 15, 2, 8, 14, 12, 0, 1, 10, 6, 9, 11, 5,0, 14, 7, 11, 10, 4, 13, 1, 5, 8, 12, 6, 9, 3, 2, 15,13, 8, 10, 1, 3, 15, 4, 2, 11, 6, 7, 12, 0, 5, 14, 9,// S盒310, 0, 9, 14, 6, 3, 15, 5, 1, 13, 12, 7, 11, 4, 2, 8,13, 7, 0, 9, 3, 4, 6, 10, 2, 8, 5, 14, 12, 11, 15, 1,13, 6, 4, 9, 8, 15, 3, 0, 11, 1, 2, 12, 5, 10, 14, 7,1, 10, 13, 0, 6, 9, 8, 7, 4, 15, 14, 3, 11, 5, 2, 12,// S盒47, 13, 14, 3, 0, 6, 9, 10, 1, 2, 8, 5, 11, 12, 4, 15, 13, 8, 11, 5, 6, 15, 0, 3, 4, 7, 2, 12, 1, 10, 14, 9, 10, 6, 9, 0, 12, 11, 7, 13, 15, 1, 3, 14, 5, 2, 8, 4, 3, 15, 0, 6, 10, 1, 13, 8, 9, 4, 5, 11, 12, 7, 2, 14, // S盒52, 12, 4, 1, 7, 10, 11, 6, 8, 5, 3, 15, 13, 0, 14, 9, 14, 11, 2, 12, 4, 7, 13, 1, 5, 0, 15, 10, 3, 9, 8, 6, 4, 2, 1, 11, 10, 13, 7, 8, 15, 9, 12, 5, 6, 3, 0, 14, 11, 8, 12, 7, 1, 14, 2, 13, 6, 15, 0, 9, 10, 4, 5, 3, // S盒612, 1, 10, 15, 9, 2, 6, 8, 0, 13, 3, 4, 14, 7, 5, 11, 10, 15, 4, 2, 7, 12, 9, 5, 6, 1, 13, 14, 0, 11, 3, 8, 9, 14, 15, 5, 2, 8, 12, 3, 7, 0, 4, 10, 1, 13, 11, 6, 4, 3, 2, 12, 9, 5, 15, 10, 11, 14, 1, 7, 6, 0, 8, 13, // S盒74, 11, 2, 14, 15, 0, 8, 13, 3, 12, 9, 7, 5, 10, 6, 1, 13, 0, 11, 7, 4, 9, 1, 10, 14, 3, 5, 12, 2, 15, 8, 6, 1, 4, 11, 13, 12, 3, 7, 14, 10, 15, 6, 8, 0, 5, 9, 2, 6, 11, 13, 8, 1, 4, 10, 7, 9, 5, 0, 15, 14, 2, 3, 12, // S盒813, 2, 8, 4, 6, 15, 11, 1, 10, 9, 3, 14, 5, 0, 12, 7, 1, 15, 13, 8, 10, 3, 7, 4, 12, 5, 6, 11, 0, 14, 9, 2, 7, 11, 4, 1, 9, 12, 14, 2, 0, 6, 10, 13, 15, 3, 5, 8, 2, 1, 14, 7, 4, 10, 8, 13, 15, 12, 9, 0, 3, 5, 6, 11 };//下面是DES算法中调用的函数:// 字节转换函数void ByteToBit(bool *Out, const char *In, int bits){for(int i=0; i<bits; ++i)Out[i] = (In[i>>3]>>(i&7)) & 1;}// 比特转换函数void BitToByte(char *Out, const bool *In, int bits){memset(Out, 0, bits>>3);for(int i=0; i<bits; ++i)Out[i>>3] |= In[i]<<(i&7);}// 变换函数void Transform(bool *Out, bool *In, const char *Table, int len){for(int i=0; i<len; ++i)Tmp[i] = In[ Table[i]-1 ];memcpy(Out, Tmp, len);}// 异或函数的实现void Xor(bool *InA, const bool *InB, int len){for(int i=0; i<len; ++i)InA[i] ^= InB[i];}// 轮转函数void RotateL(bool *In, int len, int loop){memcpy(Tmp, In, loop);memcpy(In, In+loop, len-loop);memcpy(In+len-loop, Tmp, loop);}// S函数的实现void S_func(bool Out[32], const bool In[48]) //将8组,每组6 bits的串,转化为8组,每组4 bits{for(char i=0,j,k; i<8; ++i,In+=6,Out+=4){j = (In[0]<<1) + In[5];k = (In[1]<<3) + (In[2]<<2) + (In[3]<<1) + In[4];ByteToBit(Out, &S_Box[i][j][k], 4);}}// F函数的实现void F_func(bool In[32], const bool Ki[48]){static bool MR[48];Transform(MR, In, Extension_Table, 48); //先进行E 扩展Xor(MR, Ki, 48); //再异或S_func(In, MR); //各组字符串分别经过各自的S 盒Transform(In, In, P_Table, 32); //最后P 变换}// 设置子密钥void SetSubKey(PSubKey pSubKey, const char Key[8]){static bool K[64], *KL=&K[0], *KR=&K[28]; //将64位密钥串去掉8位奇偶位后,分成两份ByteToBit(K, Key, 64); //转换格式Transform(K, K, PC1_Table, 56);for(int i=0; i<16; ++i) // 由56位密钥产生48位子密钥{RotateL(KL, 28, LOOP_Table[i]); //两份子密钥分别进行左移转换RotateL(KR, 28, LOOP_Table[i]);Transform((*pSubKey)[i], K, PC2_Table, 48);}}// 设置密钥void SetKey(const char* Key, int len){memset(deskey, 0, 16);memcpy(deskey, Key, len>16?16:len);SetSubKey(&SubKey[0], &deskey[0]);Is3DES = len>8 ? (SetSubKey(&SubKey[1], &deskey[8]), true) : false;}// DES加解密函数void DES(char Out[8], char In[8], const PSubKey pSubKey, bool Type){static bool M[64], tmp[32], *Li=&M[0], *Ri=&M[32]; //64 bits明文经过IP置换后,分成左右两份ByteToBit(M, In, 64);Transform(M, M, IP_Table, 64);if( Type == ENCRYPT ) //加密{for(int i=0; i<16; ++i) //加密时:子密钥K0~K15{memcpy(tmp, Ri, 32);F_func(Ri, (*pSubKey)[i]); // 调用F函数Xor(Ri, Li, 32); //Li与Ri异或memcpy(Li, tmp, 32);}}else //解密{for(int i=15; i>=0; --i) // 解密时:Ki的顺序与加密相反{memcpy(tmp, Li, 32);F_func(Li, (*pSubKey)[i]);Xor(Li, Ri, 32);memcpy(Ri, tmp, 32);}}Transform(M, M, IP1_Table, 64); //最后经过逆初始置换IP-1,得到密文/明文BitToByte(Out, M, 64);}// DES加解密函数(可以对长明文分段加密)bool DES_Act(char *Out, char *In, long datalen, const char *Key, int keylen, bool Type){if( !( Out && In && Key && (datalen=(datalen+7)&0xfffffff8) ) )return false;SetKey(Key, keylen);if( !Is3DES ){ // 1次DESfor(long i=0,j=datalen>>3; i<j; ++i,Out+=8,In+=8)DES(Out, In, &SubKey[0], Type);}else{ // 3次DES 加密:加(key0)-解(key1)-加(key0) 解密::解(key0)-加(key1)-解(key0)for(long i=0,j=datalen>>3; i<j; ++i,Out+=8,In+=8) {DES(Out, In, &SubKey[0], Type);DES(Out, Out, &SubKey[1], !Type);DES(Out, Out, &SubKey[0], Type);}}return true;}实验结果:心得体会:通过这次实验,我熟悉了分组密码加解密算法的基本原理,加深了对所提供的部分源程序的理解;这次实验最关键的要理解源代码,真正懂得其中算法,这是精髓。

相关文档
最新文档