DES算法的介绍和实现(上) 作者:西安 吴真
下载本文配套源代码(DES算法文件加密工具)
一.DES算法介绍
DES( Data Encryption Standard)算法,于1977年得到美国政府的正式许可,是一种用56位密钥来加密64位数据的方法。虽然56位密钥的DES算法已经风光不在,而且常有用Des加密的明文被破译的报道,但是了解一下昔日美国的标准加密算法总是有益的,而且目前DES算法得到了广泛的应用,在某些场合,她仍然发挥着余热^_^.
1.1 密钥生成
1.1.1 取得密钥
从用户处取得一个64位(本文如未特指,均指二进制位))长的密码key ,
去除64位密码中作为奇偶校验位的第8、16、24、32、40、48、56、64位,剩下的56位作为有效输入密钥.
1.1.2 等分密钥
表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 |
50 |
44 |
36 |
表2.
65 |
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 |
把在1.1.1步中生成的56位输入密钥分成均等的A,B两部分,每部分为28位,参照表1和表2把输入密钥的位值填入相应的位置. 按照表1所示A的第一位为输入的64位密钥的第57位,A的第2位为64位密钥的第49位,...,依此类推,A的最后一位最后一位是64位密钥的第36位。
1.1.3 密钥移位
表3.
i |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
? |
1 |
1 |
2 |
2 |
2 |
2 |
2 |
2 |
i |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
? |
1 |
2 |
2 |
2 |
2 |
2 |
2 |
1 |
DES算法的密钥是经过16次迭代得到一组密钥的,把在1.1.2步中生成的A,B视为迭代的起始密钥,表3显示在第i次迭代时密钥循环左移的位数. 比如在第1次迭代时密钥循环左移1位,第3次迭代时密钥循环左移2位. 第9次迭代时密钥循环左移1位,第14次迭代时密钥循环左移2位.
第一次迭代: A(1) = ?(1) A B(1) = ?(1) B 第i次迭代: A(i) = ?(i) A(i-1) B(i) = ?(i) B(i-1)
1.1.4 密钥的选取
表4.
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.1.3步中第i次迭代生成的两个28位长的密钥为
把合并
按照表4所示k的第一位为56位密钥的第14位,k的第2位为56位密钥的第17位,...,依此类推,k的最后一位最后一位是56位密钥的第32位。 生成与进行第i次迭代加密的数据进行按位异或的48位使用密钥:
1.1.5迭代 DES算法密钥生成需要进行16次迭代,在完成16次迭代前,循环执行1.1.3-1.1.4步. 最终形成16套加密密钥:key[0] , key[1] , key[2] ,…. key[14] , key[15] .
1. 2 数据的加密操作
1.2.1 取得数据 把明文数据分成64位的数据块,不够64位的数据块以适当的方式补足。
1.2.2 初始换位
表5.
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 |
按照表5所示把输入的64位数据的原第58位换到第一位,原第50位换到第二位,...,依此类推,最后的得到新的64位数据. OldData newData
1.2.3 数据扩展
表6.
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 |
第一次迭代以1.2.2步中生成的newData作为输入数据,第i (i > 1)次迭代以第i-1次的64位输出数据为输入数据,把64位数据按位置等分成左右两部分:
保持left不变,根据表6把right由32位扩展成48位
把扩展后的48位right与第i次迭代生成的48位加密密钥进行按位异或操作 形成一个新的48位的right.
1.2.4 数据压缩
表7.1
|
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
1-8 |
0xe |
0x0 |
0x4 |
0xf |
0xd |
0x7 |
0x1 |
0x4 |
9-16 |
0x2 |
0xe |
0xf |
0x2 |
0xb |
0xd |
0xb |
0xe |
17-24 |
0x3 |
0xa |
0xa |
0x6 |
0x6 |
0xc |
0xc |
0xb |
25-32 |
0x5 |
0x9 |
0x9 |
0x5 |
0x0 |
0x3 |
0x7 |
0x8 |
33-40 |
0x4 |
0xf |
0x1 |
0xc |
0xe |
0x8 |
0x8 |
0x2 |
41-48 |
0xd |
0x4 |
0x6 |
0x9 |
0x2 |
0x1 |
0xb |
0x7 |
49-56 |
0xf |
0x5 |
0xc |
0xb |
0x9 |
0x3 |
0x7 |
0xe |
57-64 |
0x3 |
0xa |
0xa |
0x0 |
0x5 |
0x6 |
0x0 |
0xd |
表7.2
|
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
1-8 |
0xf |
0x3 |
0x1 |
0xd |
0x8 |
0x4 |
0xe |
0x7 |
9-16 |
0x6 |
0xf |
0xb |
0x2 |
0x3 |
0x8 |
0x4 |
0xf |
17-24 |
0x9 |
0xc |
0x7 |
0x0 |
0x2 |
0x1 |
0xd |
0xa |
25-32 |
0xc |
0x6 |
0x0 |
0x9 |
0x5 |
0xb |
0xa |
0x5 |
33-40 |
0x0 |
0xd |
0xe |
0x8 |
0x7 |
0xa |
0xb |
0x1 |
41-48 |
0xa |
0x3 |
0x4 |
0xf |
0xd |
0x4 |
0x1 |
0x2 |
49-56 |
0x5 |
0xb |
0x8 |
0x6 |
0xc |
0x7 |
0x6 |
0xc |
57-64 |
0x9 |
0x0 |
0x3 |
0x5 |
0x2 |
0xe |
0xf |
0x9 |
表7.3
|
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
1-8 |
0xa |
0xd |
0x0 |
0x7 |
0x9 |
0x0 |
0xe |
0x9 |
9-16 |
0x6 |
0x3 |
0x3 |
0x4 |
0xf |
0x6 |
0x5 |
0xa |
17-24 |
0x1 |
0x2 |
0xd |
0x8 |
0xc |
0x5 |
0x7 |
0xe |
25-32 |
0xb |
0xc |
0x4 |
0xb |
0x2 |
0xf |
0x8 |
0x1 |
33-40 |
0xd |
0x1 |
0x6 |
0xa |
0x4 |
0xd |
0x9 |
0x0 |
41-48 |
0x8 |
0x6 |
0xf |
0x9 |
0x3 |
0x8 |
0x0 |
0x7 |
49-56 |
0xb |
0x4 |
0x1 |
0xf |
0x2 |
0xe |
0xc |
0x3 |
57-64 |
0x5 |
0xb |
0xa |
0x5 |
0xe |
0x2 |
0x7 |
0xc |
表7.4
|
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
1-8 |
0x7 |
0xd |
0xd |
0x8 |
0xe |
0xb |
0x3 |
0x5 |
9-16 |
0x0 |
0x6 |
0x6 |
0xf |
0x9 |
0x0 |
0xa |
0x3 |
17-24 |
0x1 |
0x4 |
0x2 |
0x7 |
0x8 |
0x2 |
0x5 |
0xc |
25-32 |
0xb |
0x1 |
0xc |
0xa |
0x4 |
0xe |
0xf |
0x9 |
33-40 |
0xa |
0x3 |
0x6 |
0xf |
0x9 |
0x0 |
0x0 |
0x6 |
41-48 |
0xc |
0xa |
0xb |
0xa |
0x7 |
0xd |
0xd |
0x8 |
49-56 |
0xf |
0x9 |
0x1 |
0x4 |
0x3 |
0x5 |
0xe |
0xb |
57-64 |
0x5 |
0xc |
0x2 |
0x7 |
0x8 |
0x2 |
0x4 |
0xe |
表7.5
|
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
1-8 |
0x2 |
0xe |
0xc |
0xb |
0x4 |
0x2 |
0x1 |
0xc |
9-16 |
0x7 |
0x4 |
0xa |
0x7 |
0xb |
0xd |
0x6 |
0x1 |
17-24 |
0x8 |
0x5 |
0x5 |
0x0 |
0x3 |
0xf |
0xf |
0xa |
25-32 |
0xd |
0x3 |
0x0 |
0x9 |
0xe |
0x8 |
0x9 |
0x6 |
33-40 |
0x4 |
0xb |
0x2 |
0x8 |
0x1 |
0xc |
0xb |
0x7 |
41-48 |
0xa |
0x1 |
0xd |
0xe |
0x7 |
0x2 |
0x8 |
0xd |
49-56 |
0xf |
0x6 |
0x9 |
0xf |
0xc |
0x0 |
0x5 |
0x9 |
57-64 |
0x6 |
0xa |
0x3 |
0x4 |
0x0 |
0x5 |
0xe |
0x3 |
表7.6
|
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
1-8 |
0xc |
0xa |
0x1 |
0xf |
0xa |
0x4 |
0xf |
0x2 |
9-16 |
0x9 |
0x7 |
0x2 |
0xc |
0x6 |
0x9 |
0x8 |
0x5 |
17-24 |
0x0 |
0x6 |
0xd |
0x1 |
0x3 |
0xd |
0x4 |
0xe |
25-32 |
0xe |
0x0 |
0x7 |
0xb |
0x5 |
0x3 |
0xb |
0x8 |
33-40 |
0x9 |
0x4 |
0xe |
0x3 |
0xf |
0x2 |
0x5 |
0xc |
41-48 |
0x2 |
0x9 |
0x8 |
0x5 |
0xc |
0xf |
0x3 |
0xa |
49-56 |
0x7 |
0xb |
0x0 |
0xe |
0x4 |
0x1 |
0xa |
0x7 |
57-64 |
0x1 |
0x6 |
0xd |
0x0 |
0xb |
0x8 |
0x6 |
0xd |
表7.7
|
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
1-8 |
0x4 |
0xd |
0xb |
0x0 |
0x2 |
0xb |
0xe |
0x7 |
9-16 |
0xf |
0x4 |
0x0 |
0x9 |
0x8 |
0x1 |
0xd |
0xa |
17-24 |
0x3 |
0xe |
0xc |
0x3 |
0x9 |
0x5 |
0x7 |
0xc |
25-32 |
0x5 |
0x2 |
0xa |
0xf |
0x6 |
0x8 |
0x1 |
0x6 |
33-40 |
0x1 |
0x6 |
0x4 |
0xb |
0xb |
0xd |
0xd |
0x8 |
41-48 |
0xc |
0x1 |
0x3 |
0x4 |
0x7 |
0xa |
0xe |
0x7 |
49-56 |
0xa |
| |