密码学——DES加密算法
DES 算法是一种常见的分组加密算法,由IBM公司在1971年提出。DES 算法是分组加密算法的典型代表,同时也是应用最为广泛的对称加密算法。本文将详细讲述DES 的原理以及实现过程。
概念对称加密
通信双方同时掌握一个密钥,加密解密都是由一个密钥完成的(即加密密钥等于解密密钥,加解密密钥可以相互推倒出来)。双方通信前共同拟定一个密钥,不对第三方公开。
分组密码
如果经过加密所得到的密文仅与给定的密码算法和密钥有关,与被处理的明文数据在整个明文中的位置无关,则称为分组密码体制。通常以大于等于64位的数据块为单位,加密得相同长度的密文。DES 加密算法中,明文和密文为 64 位分组。密钥的长度为 64 位,但是密钥的每个第八位设置为奇偶校验位,因此密钥的实际长度为56位。
DES加密流程DES 加密算法大致分为 4 个步骤:
(1)初始置换
(2)生成子密钥
(3)迭代过程
(4)逆置换
下面详细介绍每一部分的算法,文中提到的各种置换规则表(IP, PC_1, PC_2, ...)都是经DES算法规定、公开的算法参数。具体内容可参考这里。文中提到的置换操作,简单实现如下
def permutation(src, rule): # src:置换源向量 # rule:置换规则向量, rule[i]的值val表示将src[val]移到输出的第i位 res = [] for i in rule: res.append(src[i-1]) return res
初始置换
首先将明文\(M[64]\)使用初始置换IP(initial permutation)表进行置换得到\(M\'[64]\)
将\(M\'[64]\)按前32位,后32位分为两部分\(L_0[32],\ R_0[32]\)
生成子密钥
在后续的迭代过程中,每一轮需要用到不同的子密钥参与计算,使用密钥\(K\)生成子密钥的过程如下:
使用置换表PC_1将密钥\(K[64]\)缩减为56位的数据\(K\'[56]\)
进行16轮迭代生成16个子密钥,对于第\(i\)次迭代:
取\(K\'\)的前28位作为\(Ci\), 后28位作为\(Di\)
查找移动位数表shift表中规定的第\(i\)轮对\(C_i\)和\(D_i\)进行左移的位数\(j\)
将\(C_i\)和\(D_i\)进行循环左移\(j\)位
将移位后的\(C_i\)和\(D_i\)合并得到\(K\'_i\),使用PC_2置换表对\(K\'_i\)进行置换,得到本次迭代生成的密钥\(K_i\)
迭代过程
将初始置换得到的\(L_0\)和\(R_0\)作为输入,设\(L_i[32]\)和\(R_i[32]\)为第i次迭代结果的左半部分与右半部分,子密钥\(K_i\)为第\(i\)轮的48位加密密钥。定义运算规则:
\[\begin{split} & L_i = R_{i-1} \\ &R_i = L_{i-1} \oplus f(R_{i-1}, K_i) \end{split} \]