简介

​ DES是上个世纪70年代末开始采用的美国的商用数据加密标准。DES的加密算法是一种可以加密任意二进制数据分组对称加密算法,每个分组64bit,采用64位(实际只有56位有效)**来加密。目前DES由于速度和安全性(**过短),已经退出历史舞台了,但其算法的结构仍值得学习。

加密

大致流程

这里先借用密码学教材上的一张图,我在后面会详细解释

加密算法——DES

置换选择

​ DES加密算法中频繁使用了置换选择运算,就是按照置换选择表选择原数据中的某些位(包括重复选择和只选择部分),重新排列得到新数据。

**生成

​ DES的**长64bit,共8个字节,我们可以生成一个64bit的随机数作为**。建议的方式是生成8个8bit的随机数然后连接成64bit的**。

​ 实际上,DES的有效**长度为56bit,理论上64bit的**中,每个字节的最低位作为校验位,但在无需校验的时候可以不去管它。

子**生成

​ DES在加密时直接使用的是16个48bit的子**,而这16个子**由64bit的主**经过固定的算法生成,算法如下(以下以“主**”表示64bit的**):

  1. 64bit的主**做置换选择1,得到打乱后的56bit密码(k1)
  2. 56bit的密码(k1)等分成各28bit的前后两个部分(L,R)
  3. 对两部分分别做循环左移(移动位数见下表)
  4. 合并两部分得到新的56bit密码(k2)
  5. 对新的56bit密码(k2)使用置换选择2得到48bit子**
  6. 回到第三步,重复此过程直到得到16个子**

其中,在第1次,第2次,第9次循环左移时左移1位,其余时候左移2位

一个分组加密流程

  1. 对64bit数据进行初始置换得到置换后的64bit数据(d1)
  2. 将置换后的64bit数据(d1)等分成32bit的L(前32bit)和R(后32bit)两个部分
  3. 轮加密
    1. 当前轮的R直接作为下一轮的L(L_NEXT)使用
    2. 使用置换选择运算E将R扩展成48bit数据(d2)
    3. 将48bit数据(d2)同当前轮使用的48bit**子**(16个子**对应 16次加密)异或**得到新的48bit数(d3)
    4. 将得到的新48bit数据(d3)通过s盒子变换成32bit 数据(d4)
    5. 32bit数据(d4)经过置换选择E使得到新的32bit数据(d5)
    6. 将得到的32bit数据(d5)同L异或运算得到下一轮的R(R_NEXT)
    7. 使用得到的下一轮的L(L_NEXT)R(R_NEXT)重复上述运算,总共16次
  4. 将最后得到的两部分数据交换位置,合并得到64bit数据(d6)(R放在前32bit,L放在后32bit)
  5. 将得到的64bit数据(d6)进行逆初始置换得到64bit密文数据

上述过程中轮加密中的第2~5步对应之前流程图的f函数

S盒子变换
48bit数据每次取6bit,然后取出6bit中的第1和第6位作为s盒子的行号,取出中间4bit(第2~5位)作为s盒子的列号,得到盒子中对应的4bit数据。该操作进行8次,分别使用s盒子1~8,得到32bit数据(最左边称第一位)加密算法——DES

解密

解密流程同加密流程,唯一的区别是将16个子**逆序使用

C程序实现

DES的加密算法c程序见https://gitee.com/JanuaryJIAN/DES.git

其中包含DES用到的置换选择表(包括s盒子)

更多编码和加密算法见https://github.com/Janaury/c-encode.git

相关文章:

  • 2021-10-12
  • 2021-10-22
  • 2021-09-12
  • 2021-10-12
  • 2021-11-01
  • 2020-06-11
  • 2021-09-24
  • 2021-12-15
猜你喜欢
  • 2020-02-11
  • 2021-11-01
  • 2021-11-01
  • 2021-10-22
  • 2021-11-01
  • 2021-11-01
  • 2019-03-22
  • 2021-12-16
相关资源
相似解决方案