原創不易,轉載請註明出處。
目錄
1.算法簡介
DES(Data Encrytion Standard)算法,又被稱爲美國數據加密標準,是1972年美國IBM公司研製的對稱密碼體制加密算法。
明文按64位進行分組,密鑰長64位,密鑰事實上是56位參與DES運算(第8、16、24、32、40、48、56、64位是校驗位,使得每個密鑰都有奇數個1)分組後的明文組和56位的密鑰按位替代或交換的方法形成密文組的加密方法。
DES算法屬於對稱加密算法,加密解密公用一套算法。
本文將通過實例,詳細介紹DES加密算法的加密流程和解密流程。
2.符號
下列符號適用於本文本。
Ci:密鑰置換後左半部分,28bit
Di:密鑰置換後右半部分,28bit
Ki:密鑰置換後生成的48bit壓縮密鑰
Li:每輪明文置換後輸出64bit的左半部分,32bit
Ri:每輪明文置換後輸出64bit的右半部分,32bit
⊕:異或運算
3.加密算法流程
DES加密算法流程圖如圖3-1所示。
接下來對每一個流程進行詳細介紹。
圖3-1 DES加密算法流程圖
3.1 密鑰置換
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。
3.2 IP(初始)置換
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.3 加密處理
由圖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執行完畢。
3.4 IP逆置換
經過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 |
4.解密算法流程
加密和解密使用相同的算法。唯一不同的是密鑰的次序是相反的。即如果每一輪的加密密鑰分別是 K1、K2 ……K16 ,那麼解密密鑰就是 K16、K15 ……K1 。產生壓縮密鑰的算法也是循環的。加密是密鑰循環左移,解密是密鑰循環右移。解密密鑰每次移動的位數是:0、1、2、2、2、2、2、2、1、2、2、2、2、2、2、1。
5.總結
DES是比較早的對稱加密算法,算法相對簡單。但是目前DES已經不安全,例如:1999年1月,RSA數據安全公司宣佈:該公司所發起的對56位DES的攻擊已經由一個稱爲電子邊境基金(EFF)的組織,通過互聯網上的100000臺計算機合作在22小時15分鐘內完成。
在這種情況下,對於替代DES的要求日益增多。最終,NIST於1997年發佈公告,徵集新的數據加密標準作爲聯邦信息處理標準以代替DES。新的數據加密標準稱爲AES。
儘管如此,DES的出現是現代密碼學歷史上非常重要的事件。它對於我們分析掌握分組密碼的基本理論與設計原理仍然具有重要的意義。
附錄A 運算示例
輸入消息(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