一、加密流程
DES加密流程:
- 输入64位的明文和64位的密钥
- 初始置换IP
- 迭代16轮
- 初始逆变换IP^-1
初始置换IP:通过一个初始IP置换表,得到64bit明文分组的置换,作用就是得到一个乱序的64bit明文分组
初始逆变换:就是初始变换的逆
对于初始变换和初始逆变换对于加密的安全性并无帮助。
16轮迭代:
经过初始置换后,将64位明文分为左右两组,各32位,然后进行16轮的迭代
对于每轮迭代:
Li=Ri-1
Ri=Li-1(xor)F(Ri-1,Ki)
单轮加密变换:
因为采用的是Feistel结构
- 优点:设计容易,轮函数F不要求可逆
- 缺点:扩散速度慢;轮变换的输入有一半没有改变;左右块的处理不能并行实施
二、密钥扩展方案
输入的密钥为64bit,但其中有8bit的奇偶校验位(8,16,24,32,40,48,56,64),因此64bit的密钥中只有56bit是有效的。
下图是密钥扩展的整体流程:
置换选择PC-1:就是将56bit数据打乱重排,例如输入第57bit的数据放在第1位
对于置换选择PC-1表是如何得到的:将1到64从右到左从上到下依次排列,可以发现奇偶校验位刚好在最下边一行,直接去掉,然后前一半顺序排列57,49,41,33…,后一半数据逆序排列63,55,47,39…,即可得到置换选择PC-1表。
经过循环置换PC-1后,得到56bit数据,分为两组,每组28bit。
第一轮迭代中,输入C0, D0分别经过循环左移得到C1 ,D1,这一方面作为第二轮输入,另一方面56bitC1 ,D1经过置换选择PC-2筛选出48bit得到第一轮轮秘钥。
下图左边是每一轮左移位数,总共循环移位28次,刚好使得C0=cC6, D0=D16,使下一组加密时不需要对C0, D0进行重新设置
三、16轮迭代
- 扩展置换E
- 轮秘钥加
- S盒
- 置换P
扩展置换E:作用是为了使输入的32bit数据扩展为48bit然后和子密钥Ki进行异或运算
Ri=Li-1(xor)F(Ri-1,Ki)
扩展置换的方式看下图:
轮密钥加:用通过扩展置换E输出的48bit数据和子秘钥Ki进行异或运算,得到输出48bit数据
S盒:
通过轮密钥加得到的48bit数据后,因为要与32bit的Li-1进行异或运算,所以还要经过S盒,将48bit变为32bit
- S盒的作用就是将输入的48bit数据压缩为32bit数据,输入的48bit数据被分为8组,每组6bit,每组都要经过一个S盒,总共8个S盒,每个S盒4行16列
- S盒压缩过程:例如输入的8bit数据为b1b2b3b4b5b6(二进制),b1b6对应的十进制数就是S盒的行号,b2b3b4b5对应的十进制数就是S盒的列号,然后找到对应S盒中的数据,转化为4位二进制输出,即可得到4bit压缩数据
置换P:
四、解密流程
DES加密和解密算法相同,不同点仅在于:子秘钥的使用顺序相反,第一轮解密使用K16,以此类推。