一、DES加密过程
- 64位秘钥经子秘钥产生算法产生16个子秘钥:K1、K2……、K16, 分别供第一次到第16次加密迭代使用。
- 64位明文首先经过初始置换IP,将数据打乱重新排列并分成左右两半。左边32位构成L0,右边32位构成R0.
- 由加密函数f实现子秘钥K1对R0的加密,结果为32位的数据组f(R0, K1) 。f(R0, K1)再与L0模2相加(即异或),又得到一个32位的数据组L0&f(R0, K1). 以L0&f(R0, K1)作为第二次加密迭代的R1,
以R0作为第二次加密迭代的L1.至此,第一次加密迭代结束。- 第二次到第16次加密迭代分别用子秘钥K2到K16进行,其过程如上。
- 第16次迭代结束,产生一个64的数据组。以其左边32位作为R16, 以其右边作为L16,两者合并再经过逆初始置换IP-1,将数据重新排列,便得到64位密文。加密结束。
注:下面提到的二进制位数都是从左往右数的。
二、DES的算法细节
<1> 子秘钥的产生
64位秘钥经过置换选择1、循环左移、置换选择2等变换,产生16个48位长的子秘钥。
如图:
1. 64位秘钥中的每个字节的最后一位为奇偶校验位,所以秘钥的真实长度为56位,将这56位经置换选择1分为左右各28位,置换选择1的矩阵如下:
左部分C0 右部分D0
57 49 41 33 25 17 9 63 55 47 39 31 23 15
1 58 50 42 34 26 18 7 62 54 46 38 30 22
10 2 59 51 43 35 27 14 6 61 53 45 37 29
19 11 3 60 52 44 36 21 13 5 28 20 12 4
C0的各位依次为原始秘钥的57, 49, ……..,36位;
D0的各位依次为原始秘钥的63 ,55, ……..,4位。
2. 将得到的C0,D0各做循环左移,每一轮的循环左移如下表:
迭代次数 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
左移位数 1 1 2 2 2 2 2 2 1 2 2 2 2 2 2 1
注:左移为循环左移
3. 右移后得到C1,D1,合并后经置换选择2得到子秘钥K1,置换选择2如下表:
14 17 11 24 1 5
3 28 15 6 21 10
23 19 12 4 26 8
16 7 27 20 13 2
41 52 31 37 47 55
30 40 51 45 33 48
44 49 39 56 34 53
46 42 50 36 29 32
C1、D1合并为56位数,从中选取第14位,17位……32位作为子秘钥K1的第1-32位。
4. 迭代上面2-3步,分别得到K2-K16.
<2> 初始置换IP
将64位明文打乱重排并分为左右两半。左32位为L0, 右32位为R0, 供后面的加密迭代使用。置换IP的矩阵如下
58 50 42 34 26 18 10 2
60 52 44 36 28 20 12 4
62 54 46 38 30 22 14 6
64 56 48 40 32 24 16 8
57 49 41 33 25 17 9 1
59 51 43 35 27 19 11 3
61 53 45 37 29 21 13 5
63 55 47 39 31 23 15 7
置换后64位数据的第1-64位依次为原明文的第58,50,… ,7位。
<3>加密函数
上面得到的L0,R0分别作为加密函数的输入,先经过选择运算将32位输入扩展为48位,以便与48的子秘钥进行异或,还有后续的S盒替换。
1. 选择运算
选择运算通过重复选择某些数据位来达到数据扩展的目的,选择运算的矩阵如下:
32 1 2 3 4 5
4 5 6