DES(Data Encryption Standard),是IBM在上世纪70年代开发的单密钥对称加解密算法。该算法用56位密钥+8位奇偶校验位=64位的密钥对以64位为单位的数据块进行16轮加解密处理。DES的安全性不依懒于算法的保密,安全性仅以加密密钥的保密为基础。
1.1子密钥生成过程
用户输入的密钥被转化成64比特的二进制,然后按照密钥置换函数PC-1(8X7)压缩置换成56位,输出前28位为C0输出后28位为D0。然后将C0和D0进行16轮的循环左移及压缩置换PC-2(8X6),生成16个48位的字密钥。
Ø PC-1(8X7)压缩置换
假设密钥K(64位)=133457799BBCDFF1,红色部分为奇偶校验位。
K(64位)=00010011 00110100 01010111 01111001
10011011 10111100 11011111 11110001
表1密钥置换函数PC-1(8X7)
PC-1 |
57 |
49 |
41 |
33 |
25 |
17 |
9 |
1 |
58 |
50 |
42 |
34 |
26 |
18 |
|
10 |
2 |
59 |
51 |
43 |
35 |
27 |
|
19 |
11 |
3 |
60 |
52 |
44 |
36 |
|
63 |
55 |
47 |
39 |
31 |
23 |
15 |
|
7 |
62 |
54 |
46 |
38 |
30 |
22 |
|
14 |
6 |
61 |
53 |
45 |
37 |
29 |
|
21 |
13 |
5 |
28 |
20 |
12 |
4 |
对K使用PC-1(8X7)压缩置换,去掉8个校验位,从而得到K'。
K'(56位)=1111000 0110011 0010101 0101111
0101010 1011001 1001111 0001111
C0和D0的分类
图1密钥置换输出的分法
C0(28位)=1111000 0110011 0010101 0101111
D0(28位)=0101010 1011001 1001111 0001111
表2循环左移16轮
迭代顺序 |
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 |
C1和D1分别为C0和D0左移1位···C3和D3分别为C2和D2左移2位···最后得到C1D1~C16D16。例如:
C1=1110000 1100110 0101010 1011111
D1=1010101 0110011 0011110 0011110
C2=1100001 1001100 1010101 0111111
D2=0101010 1100110 0111100 0111101
PC-2(8X6)压缩置换
每进行一轮循环左移,就是用PC-2(8X6)进行压缩置换(由56位压缩为48位)得到一个字密钥。在压缩过程中第9、18、22、25、35、38、43、54共8位数据被丢掉。
表2压缩置换PC-2(8X6)
PC-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 |
置换过程如下图:
1.2加密
DES算法是对64位的数据块进行加密操作,不足64位要补位到64位长。明文M经过长度都为48比特的16个字密钥K来加密,最后生成长度为64比特的密文E。
1.2.1 IP初始置换
假设明文M=0123456789ABCDEF,即
M(64位)=0000 0001 0010 0011 0100 0101 0110 0111
1000 1001 1010 1011 1100 1101 1110 1111
经IP初始转换后为:
IP(64位)=1100 1100 0000 0000 1100 1100 1111 1111
1111 0000 1010 1010 1111 0000 1010 1010
初始置换函数IP(8X8)
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 |
置换后的数据分为32位左半部分L0和32位的右半部分R0。
L0(32位)=1100 1100 0000 0000 1100 1100 1111 1111
R0(32位)=1111 0000 1010 1010 1111 0000 1010 1010
1.2.2 加密数据
1) 将Rn通过E盒从32位置换为48位;
2) 将置换结果与Kn进行异或;
3) 异或后的结果通过S盒转换为32位;
4) 经过S盒得到的32位再进行P盒置换;
5) P盒置换后的结果与Ln进行异或,然后交换左右两部分,进行下一轮迭代;
6) 完成16轮迭代后,将得到的两部分数据合在一起,将L16与R16交换,在经过一个IP逆置换即可得到64位的密文。
运算规则:
* E盒置换
由于密钥K为48位,而Rn为32位,所以要将Rn置换为48位。扩展置换E盒如下表:
32 |
1 |
2 |
3 |
4 |
5 |
4 |
5 |
6 |
7 |
8 |
9 |
8 |
9 |
10 |
11 |
12 |
13 |
12 |
13 |
14 |
15 |
16 |
17 |
16 |
17 |
18 |
19 |
20 |
21 |
20 |
21 |
22 |
23 |
24 |
25 |
24 |
25 |
26 |
27 |
28 |
29 |
28 |
29 |
30 |
31 |
32 |
1 |
* S盒置换
将异或运算得到的48位结果数据分成8个6位的块,将每一块通过对应的一个S盒产生一个4位的输出,S盒接收6位的输入,经过置换输出4位的数据。(每块对应的S盒都不同)
将6位中的B1B6记为X,B2B3B4B5记为Y。X为行数,Y为列数,然后查出相应S盒的X行Y列所对应的整数,即为S盒的输出。
DES中其他算法都是线性的,而S盒运算则是非线性的,S盒不易于分析,它提供了更好的安全性。所以S盒是算法的关键所在。
* P盒置换
产生一个32位的输出,P盒置换数据如下表:
16 |
7 |
20 |
21 |
29 |
12 |
28 |
17 |
1 |
15 |
23 |
26 |
5 |
18 |
31 |
10 |
2 |
8 |
24 |
14 |
32 |
27 |
3 |
9 |
19 |
13 |
30 |
6 |
22 |
11 |
4 |
25 |
* IP逆置换
对R16L16运用一次IP逆置换(8X8),置换函数如下表:
40 |
8 |
48 |
15 |
56 |
24 |
64 |
32 |
39 |
7 |
47 |
15 |
55 |
23 |
63 |
31 |
38 |
6 |
46 |
14 |
54 |
22 |
62 |
30 |
37 |
5 |
45 |
13 |
53 |
21 |
61 |
29 |
36 |
4 |
44 |
12 |
52 |
20 |
60 |
28 |
35 |
3 |
43 |
11 |
51 |
19 |
59 |
27 |
34 |
2 |
42 |
10 |
50 |
18 |
58 |
26 |
33 |
1 |
41 |
9 |
49 |
17 |
57 |
25 |
1.3解密数据
解密过程和加密过程完全类似,只不过将16圈的字密钥序列顺序倒过来。