一、概述
数据加密标准(Data Encryption Standard, DES)是1972年美国IBM公司研制的对称密码体制加密算法。DES采用64位分组长度和56位密钥长度。本次实验在实现DES加密与解密的基础上,增加了分组链接模式。
二、功能需求
- 使用DES编写加密和解密软件
- 采用分组链接模式
- 采用有意义的超过512位(ASCII编码)的英文句子作为明文输入
- 输出算法配置参数和中间轮次加解密结果
三、总体设计
3.1 设计思想
- 配置各种初始化参数
- 将输入明文转化为对应2进制,并进行分组
- 创建16轮的子密钥列表
- 分组加密,并采用CBC模式
- 输入16进制密文,解密得到原明文
3.2 总体架构
![113f657e695909ba322f4b63937189e5.png](https://i-blog.csdnimg.cn/blog_migrate/e9d4bff77a4e299daf9ffa7c5a91c33f.jpeg)
图3.2 DES加密流程图
3.3 开发环境
操作系统为Windows 10 企业版,64位操作系统。实现语言为Python 3.7.0,实验平台为Jupyter Notebook。
四、详细设计
- 先进行参数初始化,IP置换表,IP逆置换表,S盒,扩展置换E盒,置换P盒,密钥置换盒PC-1和PC-2以及用于CBC的初始向量IV。
- 将原明文转化为对应ASCII码,再转化为对应2进制,然后以64位一组进行分组,最后不足64位时自动补齐。
- 创建子密钥列表,将16位16进制密钥转化为64位2进制数,然后进行置换选择PC-1,除去校验位,结果为56位,分成左右两组28位数,分别进行循环左移(需注意轮数),然后将二者合并,进行置换选择PC-2,进行压缩,得到48位子秘钥,同理即可得到16个子密钥。
- 分组加密,将第一个明文分组与初始向量IV异或,然后进行IP置换,此时为64位,再分成左右两个32位的分组,下一轮的左分组等于此轮的右分组,然后将此轮的右分组,先用E和进行扩展置换为48位,然后与此轮子密钥相异或,此时为48位,然后通过S盒置换为32位,再经过P盒置换为32位,再与此轮的左分组相异或,即可得到下一轮的右分组,以此类推,经过16轮之后,交换左右分组并合并,再通过IP逆置换即可得到第一个64位的密文分组,这也是IV的更新值,同理即可加密所有明文分组。最后将所有密文分组转换为16进制输入,即最后的加密结果。
- 解密时同理,先将16进制密文转换为2进制,然后注意IV的更新,以及此时子密钥使用次序相反即可。
五、测试
5.1 环境
Python 3.7.0 & Jupyter Notebook
5.2 测试方案
采用有意义的超过512位(ASCII编码)的英文句子作为明文输入,输出算法配置参数和中间轮次加解密结果
5.3 测试结果
![f192cd50b7f1f843057d7bb5a314ae8c.png](https://i-blog.csdnimg.cn/blog_migrate/6c1e7dadfaecec977f52785f32235ac4.png)
![dbd1d9dc4389f5772e255401ed7972de.png](https://i-blog.csdnimg.cn/blog_migrate/2b1e9e5936d111fd9bedbb9355611800.png)
![353f03dca701ebd841ba5fc44e5067d0.png](https://i-blog.csdnimg.cn/blog_migrate/047eed0dff8e18c6501d0345c726b706.jpeg)
![e35f666fa34809ace6e7fbd156c38ffb.png](https://i-blog.csdnimg.cn/blog_migrate/43ebcb62a675dfa8f6b99942842a3434.jpeg)
5.4 源代码
&#