原创不易,转载请注明出处。
目录
1. 算法简介
2. 符号
3. 加密算法流程
3.1 密钥置换
3.2 IP(初始)置换
3.3 加密处理
3.4 IP逆置换
4. 解密算法流程
5. 总结
附录A 运算示例
DES(Data Encrytion Standard)算法,又被称为美国数据加密标准,是1972年美国IBM公司研制的对称密码体制加密算法。
明文按64位进行分组,密钥长64位,密钥事实上是56位参与DES运算(第8、16、24、32、40、48、56、64位是校验位,使得每个密钥都有奇数个1)分组后的明文组和56位的密钥按位替代或交换的方法形成密文组的加密方法。
DES算法属于对称加密算法,加密解密公用一套算法。
本文将通过实例,详细介绍DES加密算法的加密流程和解密流程。
下列符号适用于本文本。
Ci:密钥置换后左半部分,28bit
Di:密钥置换后右半部分,28bit
Ki:密钥置换后生成的48bit压缩密钥
Li:每轮明文置换后输出64bit的左半部分,32bit
Ri:每轮明文置换后输出64bit的右半部分,32bit
⊕:异或运算
DES加密算法流程图如图3-1所示。
接下来对每一个流程进行详细介绍。
图3-1 DES加密算法流程图
1)首先对8字节(64bit)的原始密钥按照表3-1进行置换,即原始数据的57位放在新数据的第1位,原始数据的第49位放在新数据第2位,以此类推。最终得到56位新密钥。
注意置换时只用到原始密钥56bit,第8/16/24/32/40/48/56/64位是密钥的奇偶校验位,不做置换处理。表3-1中也没有8/16/24/32/40/48/56/64这8个位。
表3-1 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 |
2)再将56位新密钥分成左右两部分C0和D0,每部分28bit。
3)根据轮数,将Ci和Di分别循环左移1位或2位,每轮循环左移位数如表3-2所示。(注意:循环左移是在上一轮的基础上循环左移)
表3-2 Ci和Di 每轮循环左移位数
轮数 |
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 |
4)将循环左移的 和 合并起来,按照表3-3置换,得到48bit压缩密钥 Ki,此过程称为压缩置换。
表3-3 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 |
经过3)和4)步,得到16个48bit的压缩密钥 K1~K16。
64bit的明文首先要按照表3-4进行IP置换,即原始数据的58位放在新数据的第1位,原始数据的第50位放在新数据第2位,以此类推。得到新的64bit数据分成L0 和R0 左右两部分,每部分为32bit。
表3-4 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 |
由图3-1,经过IP置换后,接下来需要进行16轮完全相同的迭代运算。每一次迭代都需要压缩密钥 参与。每轮迭代过程如下式所示:
函数f输入为32位 和48位 ,输出32位数据。包含3步运算:E扩展置换、S盒代替、P盒置换。函数f流程图如图3-2所示。
图3-2 函数f流程图
3.3.1 E扩展置换
E扩展置换目标是将置换后的右半部分Ri 作为输入,扩展为48位(分为4位×8组)输出。
E扩展置换目的有两个:①生成与密钥相同长度的数据以进行异或运算;②提供更长的结果,在后续的替代运算中可以进行压缩。
E扩展置换原理如下表:
表3-5 扩展置换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 |
表中的数字代表位,两列黄色数据是扩展的数据,可以看出,扩展的数据是从相邻两组分别取靠近的一位,4位变为6位。靠近32位的位为1,靠近1位的位为32。表中第二行的4取自上组中的末位,9取自下组中的首位。
3.3.2 S盒代替
压缩后的密钥 与扩展置换异或以后得到48位的数据,将这个数据送人S盒,进行替代运算。替代由8个不同的S盒完成,每个S盒有6位输入4位输出。48位输入分为8个6位的分组,一个分组对应一个S盒,对应的S盒对各组进行代替操作。
图3-3 S盒代替示意图
一个S盒就是一个4行16列的表,盒中的每一项都是一个4位的数。S盒的6个输入确定了其对应的输出在哪一行哪一列,输入的高低2位做为行数H,中间4位做为列数L,在 中查找第H行L列对应的数据。
表3-6 S-box1
14 |
4 |
13 |
1 |
2 |
15 |
11 |
8 |
3 |
10 |
6 |
12 |
5 |
9 |
0 |
7 |
0 |
15 |
7 |
4 |
14 |
2 |
13 |
1 |
10 |
6 |
12 |
11 |
9 |
5 |
3 |
8 |
4 |
1 |
14 |
8 |
13 |
6 |
2 |
11 |
15 |
12 |
9 |
7 |
3 |
10 |
5 |
0 |
15 |
12 |
8 |
2 |
4 |
9 |
1 |
7 |
5 |
11 |
3 |
14 |
10 |
0 |
6 |
13 |
表3-7 S-box2
15 |
1 |
8 |
14 |
6 |
11 |
3 |
4 |
9 |
7 |
2 |
13 |
12 |
0 |
5 |
10 |
3 |
13 |
4 |
7 |
15 |
2 |
8 |
14 |
12 |
0 |
1 |
10 |
6 |
9 |
11 |
5 |
0 |
14 |
7 |
11 |
10 |
4 |
13 |
1 |
5 |
8 |
12 |
6 |
9 |
3 |
2 |
15 |
13 |
8 |
10 |
1 |
3 |
15 |
4 |
2 |
11 |
6 |
7 |
12 |
0 |
5 |
14 |
9 |
表3-8 S-box3
10 |
0 |
9 |
14 |
6 |
3 |
15 |
5 |
1 |
13 |
12 |
7 |
11 |
4 |
2 |
8 |
13 |
7 |
0 |
9 |
3 |
4 |
6 |
10 |
2 |
8 |
5 |
14 |
12 |
11 |
15 |
1 |
13 |
6 |
4 |
9 |
8 |
15 |
3 |
0 |
11 |
1 |
2 |
12 |
5 |
10 |
14 |
7 |
1 |
10 |
13 |
0 |
6 |
9 |
8 |
7 |
4 |
15 |
14 |
3 |
11 |
5 |
2 |
12 |
表3-9 S-box4
7 |
13 |
14 |
3 |
0 |
6 |
9 |
10 |
1 |
2 |
8 |
5 |
11 |
12 |
4 |
15 |
13 |
8 |
11 |
5 |
6 |
15 |
0 |
3 |
4 |
7 |
2 |
12 |
1 |
10 |
14 |
19 |
10 |
6 |
9 |
0 |
12 |
11 |
7 |
13 |
15 |
1 |
3 |
14 |
5 |
2 |
8 |
4 |
3 |
15 |
0 |
6 |
10 |
1 |
13 |
8 |
9 |
4 |
5 |
11 |
12 |
7 |
2 |
14 |
表3-10 S-box5
2 |
12 |
4 |
1 |
7 |
10 |
11 |
6 |
5 |
8 |
3 |
15 |
13 |
0 |
14 |
9 |
14 |
11 |
2 |
12 |
4 |
7 |
13 |
1 |
5 |
0 |
15 |
13 |
3 |
9 |
8 |
6 |
4 |
2 |
1 |
11 |
10 |
13 |
7 |
8 |
15 |
9 |
12 |
5 |
6 |
3 |
0 |
14 |
11 |
8 |
12 |
7 |
1 |
14 |
2 |
13 |
6 |
15 |
0 |
9 |
10 |
4 |
5 |
3 |
表3-11 S-box6
12 |
1 |
10 |
15 |
9 |
2 |
6 |
8 |
0 |
13 |
3 |
4 |
14 |
7 |
5 |
11 |
10 |
15 |
4 |
2 |
7 |
12 |
9 |
5 |
6 |
1 |
13 |
14 |
0 |
11 |
3 |
8 |
9 |
14 |
15 |
5 |
2 |
8 |
12 |
3 |
7 |
0 |
4 |
10 |
1 |
13 |
11 |
6 |
4 |
3 |
2 |
12 |
9 |
5 |
15 |
10 |
11 |
14 |
1 |
7 |
6 |
0 |
8 |
13 |
表3-12 S-box7
4 |
11 |
2 |
14 |
15 |
0 |
8 |
13 |
3 |
12 |
9 |
7 |
5 |
10 |
6 |
1 |
13 |
0 |
11 |
7 |
4 |
9 |
1 |
10 |
14 |
3 |
5 |
12 |
2 |
15 |
8 |
6 |
1 |
4 |
11 |
13 |
12 |
3 |
7 |
14 |
10 |
15 |
6 |
8 |
0 |
5 |
9 |
2 |
6 |
11 |
13 |
8 |
1 |
4 |
10 |
7 |
9 |
5 |
0 |
15 |
14 |
2 |
3 |
12 |
表3-13 S-box8
13 |
2 |
8 |
4 |
6 |
15 |
11 |
1 |
10 |
9 |
3 |
14 |
5 |
0 |
12 |
7 |
1 |
15 |
13 |
8 |
10 |
3 |
7 |
4 |
12 |
5 |
6 |
11 |
0 |
14 |
9 |
2 |
7 |
11 |
4 |
1 |
9 |
12 |
14 |
2 |
0 |
6 |
10 |
13 |
15 |
3 |
5 |
8 |
2 |
1 |
14 |
7 |
4 |
10 |
8 |
13 |
15 |
12 |
9 |
0 |
3 |
5 |
6 |
11 |
例如,假设S盒8的输入为110011,第1位和第6位组合为11,对应于S盒8的第3行;第2位到第5位为1001,对应于S盒8的第9列。S盒8的第3行第9列的数字为12,因此用1100来代替110011。注意,S盒的行列计数都是从0开始。
代替过程产生8个4位的分组,组合在一起形成32位数据。
S盒代替是DES算法的关键步骤,所有的其他的运算都是线性的,易于分析,而S盒是非线性的,相比于其他步骤,提供了更好安全性。
3.3.3 P盒置换
S盒置换后,得到一个32位输出,将此输出按照P盒进行置换。该置换把输入的每位映射到输出位,任何一位不能被映射两次,也不能被略去,映射规则如表3-14所示:
表3-14 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 |
置换规则与之前置换规则一致。
P盒置换后,输出一个32位数据,至此函数f执行完毕。
经过16轮加密处理,最终得到L16和R16 。然后将 和 互换位置,合并成一个64位数进行IP逆置换。逆置换规则如表3-15所示。
表3-15 逆置换规则
40 |
8 |
48 |
16 |
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 |
逆置换之后得到64位密文。
加密和解密使用相同的算法。唯一不同的是密钥的次序是相反的。即如果每一轮的加密密钥分别是 K1、K2 ……K16 ,那么解密密钥就是 K16、K15 ……K1 。产生压缩密钥的算法也是循环的。加密是密钥循环左移,解密是密钥循环右移。解密密钥每次移动的位数是:0、1、2、2、2、2、2、2、1、2、2、2、2、2、2、1。
DES是比较早的对称加密算法,算法相对简单。但是目前DES已经不安全,例如:1999年1月,RSA数据安全公司宣布:该公司所发起的对56位DES的攻击已经由一个称为电子边境基金(EFF)的组织,通过互联网上的100000台计算机合作在22小时15分钟内完成。
在这种情况下,对于替代DES的要求日益增多。最终,NIST于1997年发布公告,征集新的数据加密标准作为联邦信息处理标准以代替DES。新的数据加密标准称为AES。
尽管如此,DES的出现是现代密码学历史上非常重要的事件。它对于我们分析掌握分组密码的基本理论与设计原理仍然具有重要的意义。
输入消息(8字节):
0x01,0x23,0x45,0x67,0x89,0xab,0xcd,0xef
原始密钥(8字节):
0x13,0x34,0x57,0x79,0x9b,0xbc,0xdf,0xf1
压缩密钥:
C0C1……C16(每字节低7位有效) D1D2……D16(每字节低7位有效)
C0:0x78 0x33 0x15 0x2f D0:0x2a 0x59 0x4f 0x0f
C1:0x70 0x66 0x2a 0x5f D1:0x55 0x33 0x1e 0x1e
C2:0x61 0x4c 0x55 0x3f D2:0x2a 0x66 0x3c 0x3d
C3:0x06 0x32 0x55 0x7f D3:0x2b 0x19 0x71 0x75
C4:0x19 0x4a 0x57 0x7c D4:0x2c 0x67 0x47 0x55
C5:0x66 0x2a 0x5f 0x70 D5:0x33 0x1e 0x1e 0x55
C6:0x19 0x2a 0x7f 0x43 D6:0x4c 0x78 0x7a 0x55
C7:0x65 0x2b 0x7e 0x0c D7:0x33 0x63 0x6a 0x56
C8:0x15 0x2f 0x78 0x33 D8:0x4f 0x0f 0x2a 0x59
C9:0x2a 0x5f 0x70 0x66 D9:0x1e 0x1e 0x55 0x33
C10:0x2a 0x7f 0x43 0x19 D10:0x78 0x7a 0x55 0x4c
C11:0x2b 0x7e 0x0c 0x65 D11:0x63 0x6a 0x56 0x33
C12:0x2f 0x78 0x33 0x15 D12:0x0f 0x2a 0x59 0x4f
C13:0x3f 0x61 0x4c 0x55 D13:0x3d 0x2a 0x66 0x3c
C14:0x7f 0x06 0x32 0x55 D14:0x75 0x2b 0x19 0x71
C15:0x7c 0x19 0x4a 0x57 D15:0x55 0x2c 0x67 0x47
C16:0x78 0x33 0x15 0x2f D16:0x2a 0x59 0x4f 0x0f
K0,K1……K16(每字节低6位有效)
K0:0x78 0x33 0x15 0x2f 0x2a 0x59 0x4f 0x0f
K1:0x06 0x30 0x0b 0x2f 0x3f 0x07 0x01 0x32
K2:0x1e 0x1a 0x3b 0x19 0x36 0x3c 0x27 0x25
K3:0x15 0x1f 0x32 0x0a 0x10 0x2c 0x3e 0x19
K4:0x1c 0x2a 0x37 0x16 0x36 0x33 0x14 0x1d
K5:0x1f 0x0e 0x30 0x07 0x3a 0x35 0x0e 0x28
K6:0x18 0x3a 0x14 0x3e 0x14 0x07 0x2c 0x2f
K7:0x3b 0x08 0x12 0x37 0x3d 0x21 0x22 0x3c
K8:0x3d 0x38 0x28 0x3a 0x30 0x13 0x2f 0x3b
K9:0x38 0x0d 0x2f 0x2b 0x3b 0x1e 0x1e 0x01
K10:0x2c 0x1f 0x0d 0x07 0x2e 0x24 0x19 0x0f
K11:0x08 0x15 0x3f 0x13 0x37 0x2d 0x0e 0x06
K12:0x1d 0x17 0x07 0x35 0x25 0x06 0x1f 0x29
K13:0x25 0x3c 0x17 0x11 0x3e 0x2b 0x29 0x01
K14:0x17 0x34 0x0e 0x37 0x3c 0x2e 0x1c 0x3a
K15:0x2f 0x39 0x06 0x0d 0x0f 0x13 0x3c 0x0a
K16:0x32 0x33 0x36 0x0b 0x03 0x21 0x1f 0x35
IP置换,得到L0和R0
L0:0xcc00ccff
R0:0xf0aaf0aa
加密处理,得到L1~L16和R1~R16
L1~L16:
0xf0aaf0aa 0xef4a6544 0xcc017709 0xa25c0bf4
0x77220045 0x8a4fa637 0xe967cd69 0x064aba10
0xd5694b90 0x247cc67a 0xb7d5d7b2 0xc5783c78
0x75bd1858 0x18c3155a 0xc28c960d 0x43423234
R1~R16:
0xef4a6544 0xcc017709 0xa25c0bf4 0x77220045
0x8a4fa637 0xe967cd69 0x064aba10 0xd5694b90
0x247cc67a 0xb7d5d7b2 0xc5783c78 0x75bd1858
0x18c3155a 0xc28c960d 0x43423234 0x0a4cd995
IP逆置换,得到密文
0x85 0xe8 0x13 0x54 0x0f 0x0a 0xb4 0x05
参考文献:
[1]https://blog.csdn.net/qq_27570955/article/details/52442092
[2]https://www.cnblogs.com/songwenlong/p/5944139.html