DES
First Post:
Last Update:
Last Update:
DES
DES是上世纪八十年代主流的加密算法,DES为分组密码,也就是块密码,块长度为64位,密钥长度为64位,但有8位为校验位,实际长度只有56位,明文按每组64位分组。
结构
DES采用feistel结构,也就是加密和解密的过程相同
块大小越大,密钥长度越长,轮数越多,轮函数越复杂,安全性越高
DES中对明文会进行16轮的加密运算,每一轮都有一个相应的子密钥参与,在开头和结尾还会有初始置换和最终置换的操作
置换
初始置换和最终置换就是简单地根据置换表在一个64bit的块中进行变换
例如表中第一个数字是58,那就将第一个字节和第58个字节进行置换
代码实现:
1 | |
轮加密
每一轮加密运算时,先将明文分成左右两块L0,R0,在每一轮中,进行如下运算
Li+1=Ri
Ri+1=Li⊕F(Ri,Ki)
F为轮函数
根据图片可以看到R0直接变成L1,而L0与轮函数中产生的32位数据异或得到R1,轮函数需要R0和子密钥作为输入
代码实现:
1 | |
轮函数结构
先通过Expansion将32bit扩展为48bit,再与48bit的子密钥混合作异或运算,然后将48bit分别分为8组,每组6bit,经过S盒替换,输出8组4bit,即32bit。最后对这32bit进行移位置换P
下图为S盒:
代码实现:
1 | |
密钥扩展
由于子密钥需要16组,所以我们需要用初始64bit密钥进行密钥扩展,得到16组子密钥:
1.先通过PC-1置换去除64bit密钥中的校验位,得到56位密钥
2.将56位密钥对半分,得到两个28位
3.连续16轮运算,每一轮分别先对左右两半循环移位,再经过PC-2置换生成一个48bit的子密钥
4.最终得到16组48bit的子密钥,用于加解密
代码实现:
1 | |