歡迎光臨
每天分享高質量文章

演算法科普:神秘的 DES 加密演算法

來自:五分鐘學演算法(微信號:CXYxiaowu)

1、前言

DES 演算法是一種常見的分組加密演算法,由IBM公司在1971年提出。DES 演算法是分組加密演算法的典型代表,同時也是應用最為廣泛的對稱加密演算法。本文將詳細講述DES 的原理以及實現過程。

1.1 明文

明文是指沒有經過加密的資料。一般而言,明文都是等待傳輸的資料。由於沒有經過加密,明文很容易被識別與破解,因此在傳輸明文之前必須進行加密處理。

1.2 密文

密文只是明文經過某種加密演算法而得到的資料,通常密文的形式複雜難以識別及理解。

1.3 密鑰

密鑰是一種引數,它是在明文轉換為密文或將密文轉換為明文的演算法中輸入的引數。

1.4 對稱加密

通信雙方同時掌握一個密鑰,加密解密都是由一個密鑰完成的(即加密密鑰等於解密密鑰,加解密密鑰可以相互推倒出來)。雙方通信前共同擬定一個密鑰,不對第三方公開。

1.5 分組密碼

分組密碼是將明文分成固定長度的組,每一組都採用同一密鑰和演算法進行加密,輸出也是固定長度的密文。

2、DES 加密演算法

2.1 分組長度

DES 加密演算法中,明文和密文為 64 位分組。密鑰的長度為 64 位,但是密鑰的每個第八位設置為奇偶校驗位,因此密鑰的實際長度為56位。

2.2 加密流程

DES 加密演算法大致分為 4 個步驟:

(1)初始置換
(2)生成子密鑰
(3)迭代過程
(4)逆置換

整個過程流程圖:

加密流程

3、初始置換

初始置換是將原始明文經過IP置換表處理。置換過程如圖:

置換過程

例如:
輸入64位明文資料M(64位):
明文M(64位)=
0110001101101111011011010111000001110101011101000110010101110010
選取密鑰K(64位):
密鑰K(64位)=
0001001100110100010101110111100110011011101111001101111111110001

IP置換表:

58,50,42,34,26,18,10,02,
60,52,44,36,28,20,12,04,
62,54,46,38,30,22,14,06,
64,56,48,40,32,24,16,08,
57,49,41,33,25,17,09,01,
59,51,43,35,27,19,11,03,
61,53,45,37,29,21,13,05,
63,55,47,39,31,23,15,07,

IP置換表中的資料指的是位置,例如58指將M第58位放置第1位。

M經過IP置換後為M’

M’(64位) =
1111111110111000011101100101011100000000111111110000011010000011
取M’的前32位作為L0,則有
L0(32位)= 11111111101110000111011001010111
取M’的後32位作為R0,則有
R0(32位)= 00000000111111110000011010000011

4、生成子密鑰

DES 加密共執行16次迭代,每次迭代過程的資料長度為48位,因此需要16個48位的子密鑰來進行加密,生成子密鑰的過程如下:

生成子密鑰

以第3節的例子說明子密鑰的計算過程:

(1)第一輪置換:

密鑰 K = 0001001100110100010101110111100110011011101111001101111111110001需經過PC-1表置換,即執行置換選擇1過程。
PC-1表為:

57,49,41,33,25,17,09
01,58,50,42,34,26,18
10,02,59,51,43,35,27
19,11,03,60,52,44,36
63,55,47,39,31,23,15
07,62,54,46,38,30,22
14,06,61,53,45,37,29
21,13,05,28,20,12,04

PC-1表為8行7列的表,密鑰K經PC-1後變為56位資料K’。

K’(56位)= 11110000110011001010101011110101010101100110011110001111
取K’的前28位作為C0,則有
C0(28位)= 1111000011001100101010101111
取K’的後28位作為D0,則有
D0(28位)= 0101010101100110011110001111
獲得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

進行第一輪移位,輪數為1,查表得左移位數為1。

C0左移1位為C1:
C1(28位) = 1110000110011001010101011111
D0左移1位為D1:
D1(28位) = 1010101011001100111100011110
將C1和D1合併後,經過PC-2表置換得到子密鑰K1,PC-2表中去除了第9,18,22,25,35,38,43,54位。

PPC-2表為6X8的表,PC-2表如下:

14,17,11,24,01,05,
03,28,15,06,21,10,
23,19,12,04,26,08,
16,07,27,20,13,02,
41,52,31,37,47,55,
30,40,51,45,33,48,
44,49,39,56,34,53,
46,42,50,36,29,32

由於PC-2表為6X8的表,經PC-2置換後的資料為48位,置換後得到密鑰K1,
K1(48位)= 000110110000001011101111111111000111000001110010

(2)第二輪置換

C1和D1再次左移,輪數 = 2,查表得左移位數 = 1,則C1和D1左移1位得到C2和D2。

C2(28位)= 1100001100110010101010111111
D2(28位)= 0101010110011001111000111101
C2和D2合併後為56位,經過PC-2表置換得到密鑰K2(48位)
K2(48位)= 011110011010111011011001110110111100100111100101
依次類推,得到K3-K16子密鑰,註意Ci和Di左移的位數。

C3(28位) = 0000110011001010101011111111
D3(28位) = 0101011001100111100011110101
K3(48位) = 010101011111110010001010010000101100111110011001

C4(28位) = 0011001100101010101111111100
D4(28位) = 0101100110011110001111010101
K4(48位) = 011100101010110111010110110110110011010100011101

C5(28位) = 1100110010101010111111110000
D5(28位) = 0110011001111000111101010101
K5(48位) = 011111001110110000000111111010110101001110101000

C6(28位) = 0011001010101011111111000011
D6(28位) = 1001100111100011110101010101
K6(48位) = 011000111010010100111110010100000111101100101111

C7(28位) = 1100101010101111111100001100
D7(28位) = 0110011110001111010101010110
K7(48位) = 111011001000010010110111111101100001100010111100

C8(28位) = 0010101010111111110000110011
D8(28位) = 1001111000111101010101011001
K8(48位) = 111101111000101000111010110000010011101111111011

C9(28位) = 0101010101111111100001100110
D9(28位) = 0011110001111010101010110011
K9(48位) = 111000001101101111101011111011011110011110000001

C10(28位) = 0101010111111110000110011001
D10(28位) = 1111000111101010101011001100
K10(48位) = 101100011111001101000111101110100100011001001111

C11(28位) = 0101011111111000011001100101
D11(28位) = 1100011110101010101100110011
K11(48位) = 001000010101111111010011110111101101001110000110

C12(28位) = 0101111111100001100110010101
D12(28位) = 0001111010101010110011001111
K12(48位) = 011101010111000111110101100101000110011111101001

C13(28位) = 0111111110000110011001010101
D13(28位) = 0111101010101011001100111100
K13(48位) = 100101111100010111010001111110101011101001000001

C14(28位) = 1111111000011001100101010101
D14(28位) = 1110101010101100110011110001
K14(48位) = 010111110100001110110111111100101110011100111010

C15(28位) = 1111100001100110010101010111
D15(28位) = 1010101010110011001111000111
K15(48位) = 101111111001000110001101001111010011111100001010

C16(28位) = 1111000011001100101010101111
D16(28位) = 0101010101100110011110001111
K16(48位) = 110010110011110110001011000011100001011111110101

5、迭代過程

設Li(32位)和Ri(32位)為第i次迭代結果的左半部分與右半部分,子密鑰Ki為第i輪的48位加密密鑰。定義運算規則:

Li = Ri-1;
Ri = Li ⊕ f(Ri-1, Ki);

整個迭代過程如下圖:

img

5.1 擴展置換E

右半部分Ri的位數為32位,而密鑰長度Ki為48位,為了能夠保證Ri與Ki可以進行異或運算需要對Ri位數進行擴展,用於擴展置換表E如下:

擴展置換表E:

32,01,02,03,04,05,
04,05,06,07,08,09,
08,09,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,01

例如:
L0(32位) = 11111111101110000111011001010111
R0(32位) = 00000000111111110000011010000011
R0(32位)經過擴展置換後變為48位資料:
E(R0)(48位) = 100000000001011111111110100000001101010000000110

將E(R0)(48位)與K1(48位)作異或運算

100000000001011111111110100000001101010000000110
000110110000001011101111111111000111000001110010
= 100110110001010100010001011111001010010001110100

得到:
E(R0)^K1(48位) = 100110110001010100010001011111001010010001110100

5.2 S-盒替代

代替運算由8個不同的代替盒(S盒)完成。每個S盒有6位輸入,4位輸出。代替運算流程如下:

代替運算流程

S-盒1:

14,04,13,01,02,15,11,08,03,10,06,12,05,09,00,07,
00,15,07,04,14,02,13,01,10,06,12,11,09,05,03,08,
04,01,14,08,13,06,02,11,15,12,09,07,03,10,05,00,
15,12,08,02,04,09,01,07,05,11,03,14,10,00,06,13,

S-盒2:

15,01,08,14,06,11,03,04,09,07,02,13,12,00,05,10,
03,13,04,07,15,02,08,14,12,00,01,10,06,09,11,05,
00,14,07,11,10,04,13,01,05,08,12,06,09,03,02,15,
13,08,10,01,03,15,04,02,11,06,07,12,00,05,14,09,

S-盒3:

10,00,09,14,06,03,15,05,01,13,12,07,11,04,02,08,
13,07,00,09,03,04,06,10,02,08,05,14,12,11,15,01,
13,06,04,09,08,15,03,00,11,01,02,12,05,10,14,07,
01,10,13,00,06,09,08,07,04,15,14,03,11,05,02,12,

S-盒4:

07,13,14,03,00,06,09,10,01,02,08,05,11,12,04,15,
13,08,11,05,06,15,00,03,04,07,02,12,01,10,14,09,
10,06,09,00,12,11,07,13,15,01,03,14,05,02,08,04,
03,15,00,06,10,01,13,08,09,04,05,11,12,07,02,14,

S-盒5:

02,12,04,01,07,10,11,06,08,05,03,15,13,00,14,09,
14,11,02,12,04,07,13,01,05,00,15,10,03,09,08,06,
04,02,01,11,10,13,07,08,15,09,12,05,06,03,00,14,
11,08,12,07,01,14,02,13,06,15,00,09,10,04,05,03,

S-盒6:

12,01,10,15,09,02,06,08,00,13,03,04,14,07,05,11,
10,15,04,02,07,12,09,05,06,01,13,14,00,11,03,08,
09,14,15,05,02,08,12,03,07,00,04,10,01,13,11,06,
04,03,02,12,09,05,15,10,11,14,01,07,06,00,08,13,

S-盒7:

04,11,02,14,15,00,08,13,03,12,09,07,05,10,06,01,
13,00,11,07,04,09,01,10,14,03,05,12,02,15,08,06,
01,04,11,13,12,03,07,14,10,15,06,08,00,05,09,02,
06,11,13,08,01,04,10,07,09,05,00,15,14,02,03,12,

S-盒8:

13,02,08,04,06,15,11,01,10,09,03,14,05,00,12,07,
01,15,13,08,10,03,07,04,12,05,06,11,00,14,09,02,
07,11,04,01,09,12,14,02,00,06,10,13,15,03,05,08,
02,01,14,07,04,10,08,13,15,12,09,00,03,05,06,11,

S盒的計算規則:
例如:若S-盒1的輸入為110111,第一位與最後一位構成11,十進制值為3,則對應第3行,中間4位為1011對應的十進制值為11,則對應第11列。查找S-盒1表的值為14,則S-盒1的輸出為1110。8個S盒將輸入的48位資料輸出為32位資料。

按照S-盒的計算過程,將
E(R0)^K1(48位)= 100110110001010100010001011111001010010001110100,通過 S- 盒替換得到的S盒輸出為10001011110001000110001011101010(32位)。

5.3 P-盒置換

將S-盒替代的輸出結果作為P-盒置換的輸入。P-盒置換表如下:

16,07,20,21,29,12,28,17,01,15,23,26,05,18,31,10,
02,08,24,14,32,27,03,09,19,13,30,06,22,11,04,25,

將S盒輸出10001011110001000110001011101010(32位)經過P盒置換,P-盒置換輸出01001000101111110101010110000001

擴展置換E、S-盒替代、P盒置換的過程作為函式f。

第一次迭代過程f(R0,K1)為:
f(R0,K1) = 01001000101111110101010110000001

計算L1(32位)= R0 = 00000000111111110000011010000011
計算R1(32位)= L0 ^ f(R0,K1)
11111111101110000111011001010111
01001000101111110101010110000001
= 10110111000001110010001111010110

R1(32位) = 10110111000001110010001111010110。
將L1與R1作為輸入,繼續執行迭代過程f。直至輸出L16與R16。

經過16次迭代後輸出:

L16(32位)= 00110000100001001101101100101000
R16(32位)= 10110001011001010011000000011000

6、逆置換

將初始置換進行16次的迭代,即進行16層的加密變換,得到L16和R16,將此作為輸入塊,進行逆置換得到最終的密文輸出塊。逆置換是初始置換的逆運算。從初始置換規則中可以看到,原始資料的第1位置換到了第40位,第2位置換到了第8位。則逆置換就是將第40位置換到第1位,第8位置換到第2位。以此類推,逆置換規則表如下

40,08,48,16,56,24,64,32,
39,07,47,15,55,23,63,31,
38,06,46,14,54,22,62,30,
37,05,45,13,53,21,61,29,
36,04,44,12,52,20,60,28,
35,03,43,11,51,19,59,27,
34,02,42,10,50,18,58 26,
33,01,41,09,49,17,57,25,

逆置換過程圖:

逆置換過程

將L16與R16構成64位資料,經過逆置換表輸出密文為:

密文:0101100000001000001100000000101111001101110101100001100001101000

7、結語

DES 加密演算法為最為常見的分組加密演算法。其主要思想在於資料位的置換與移位過程,通過16次的迭代加密與最終的逆置換得出最終的密文。DES 的解密方式只需按照加密的逆過程求解即可。由於DES 加密過程的演算法是公開的,所以密鑰K的保密就顯得尤為重要,只有發送方與接收方採用相同的密鑰進行加密解密才能獲取明文資料。

    赞(0)

    分享創造快樂