淺析DES原理

對稱密碼體制

對稱密碼體制:一種加密系統。其加密密鑰和解密密鑰是相同的,或者能夠從其中之一推知另一個。對稱密碼體制根據對明文加密方式不同分為分組密碼和流密碼。

分組密碼

分組密碼按照一定長度(如64bit、128bit)對名文分組,然後以組為單位進行加、解密。

分組密碼系統:對不同的組採用同樣的密鑰k來進行性加密、解密。
明文組:image

密文:image

image

分組密碼設計就是找到一種演算法,能在密鑰的控制下,從一個足夠大、足夠好的置換子集中簡單、迅速的選出一個置換、對當前輸入的明文數字組進行加密變換。
演算法要求:

  • 分組長度足夠大,使得不同明文分組的個數2^n足夠大,以防止明文被窮舉法攻擊。
  • 密鑰空間應足夠發,儘可能消除弱密鑰,從而使所有密鑰同等概率,以防窮舉密鑰攻擊,同時密鑰不能太長,以利於密鑰管理。
  • 由密鑰確定的演算法要足夠複雜,充分實現明文與密鑰的擴散和混淆,沒有簡單的關係可循,要能抵抗各種已知的攻擊,差分攻擊、線性攻擊等。
  • 要盡量使用適合編程的子塊和簡單的運算
  • 加密解密應具有像是性。

分組密碼的一般結構

Feistel結構

image

  • 明文P為64b的數據被平分為32b的L0和R0,如果明文數據不足64b就用一種特殊的方法填充到64b。
  • +表示異或
  • K表示種子密鑰64位,ki表示子密鑰,是48b的密鑰。那這裡就會有疑問了,密鑰是48b的數據,每次加密的明文是32b的數據,怎麼如何進行加密呢,這裡就是F的作用了,
  • F是輪函數,在輪函數裡面會對數據進行處理,首先會對明文進行E拓展置換,然後明文就變換為48b的數據,讓後與ki進行異或,在進行S盒替換目的是在壓縮為32b數據,和P盒替換四個過程。
  • 結果:Li=R(i-1) ; Ri=L(i-1)異或F(Ri-1,ki)
SP結構

image

F輪函數內容

F輪函數包括(E擴展置換-數據擴展為48b、數據與密鑰異或、S盒壓縮處理-數據變為32b、P盒置換)

E拓展置換

  • E拓展置換簡單來說就是把分組後的32b的數據拓展為48位數據,為了盒子密鑰進行異或。我們假設32b的數據就是如下圖排列,那麼黃色標註的數據就是添加的數據,也就是把原本8行4列的數據拓展為8行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
  • 拓展原理
    • 第一步:就是把32b的數據,變為8組4b的數據。
    • 第二步:然後再每組後面添加下一組的第一個數據.
    • 第三步:再每組數據前面添加上一組數據的最後一個數據。
    • 第四步:第一組和第八組分別沒有前一組和後一組,那他們兩組就是首尾相連。就是32位數據組成一個循環的圈,那每一組都會有前驅和後繼了。

image

S盒壓縮處理

經過拓展的48位明文和密鑰進行異或運算後,再使用8個S盒壓縮處理得到32位數據。

  • 將48位數據分為8塊,每6位壓縮為4位數據。
  • 每一組數據取頭尾兩個數組成一個二位二進位數作為列,中間4位數對應行,找相應s和該位置數據就是轉換後的數據,如六位011001取第一位和第六位是01那就是第一行,中間四位是1100那就是第十二列,假設為第一組的數據那就去找S1盒的1行12列對應數據是9,那轉換後的數據就是1001
  • 注意點:行和列對應的範圍是0-3和0-15.
  • s盒對應表很容易在網上尋找,這裡我也複製下來了。

image

  • S1盒
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
0 14 4 13 1 2 15 11 8 3 10 6 12 5 9 0 7
1 0 15 7 4 14 2 13 1 10 6 12 11 9 5 3 8
2 4 1 14 8 13 6 2 11 15 12 9 7 3 10 5 0
3 15 12 8 2 4 9 1 7 5 11 3 14 10 0 6 13
  • S2盒
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
0 15 1 8 14 6 11 3 4 9 7 2 13 12 0 5 10
1 3 13 4 7 15 2 8 14 12 0 1 10 6 9 11 5
2 0 14 7 11 10 4 13 1 5 8 12 6 9 3 2 15
3 13 8 10 1 3 15 4 2 11 6 7 12 0 5 14 9
  • S3盒
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
0 10 0 9 14 6 3 15 5 1 13 12 7 11 4 2 8
1 13 7 0 9 3 4 6 10 2 8 5 14 12 11 15 1
2 13 6 4 9 8 15 3 0 11 1 2 12 5 10 14 7
3 1 10 13 0 6 9 8 7 4 15 14 3 11 5 2 12
  • S4盒
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
0 7 13 14 3 0 6 9 10 1 2 8 5 11 12 4 15
1 13 8 11 5 6 15 0 3 4 7 2 12 1 10 14 9
2 10 6 9 0 12 11 7 13 15 1 3 14 5 2 8 4
3 3 15 0 6 10 1 13 8 9 4 5 11 12 7 2 14
  • S5盒
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
0 2 12 4 1 7 10 11 6 8 5 3 15 13 0 14 9
1 14 11 2 12 4 7 13 1 5 0 15 10 3 9 8 6
2 4 2 1 11 10 13 7 8 15 9 12 5 6 3 0 14
3 11 8 12 7 1 14 2 13 6 15 0 9 10 4 5 3
  • S6盒
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
0 12 1 10 15 9 2 6 8 0 13 3 4 14 7 5 11
1 10 15 4 2 7 12 9 5 6 1 13 14 0 11 3 8
2 9 14 15 5 2 8 12 3 7 0 4 10 1 13 11 6
3 4 3 2 12 9 5 15 10 11 14 1 7 6 0 8 13
  • S7盒
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
0 4 11 2 14 15 0 8 13 3 12 9 7 5 10 6 1
1 13 0 11 7 4 9 1 10 14 3 5 12 2 15 8 6
2 1 4 11 13 12 3 7 14 10 15 6 8 0 5 9 2
3 6 11 13 8 1 4 10 7 9 5 0 15 14 2 3 12
  • S8盒
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
0 13 2 8 4 6 15 11 1 10 9 3 14 5 0 12 7
1 1 15 13 8 10 3 7 4 12 5 6 11 0 14 9 2
2 7 11 4 1 9 12 14 2 0 6 10 13 15 3 5 8
3 2 1 14 7 4 10 8 13 15 12 9 0 3 5 6 11

P盒轉換

P盒轉換和初始轉換相似,原理是一樣的,這裡先不說轉換過程,等到下面初始置換的時候再說,現在這裡保存P盒置換表
image

DES

DES是分組長度為64b的分組密碼演算法。密鑰長度也是64b,其中每8b有一個奇偶校驗位,所以有效長度為56b。採用Feistel結構。

DES演算法框圖

image
初始置換IP和初始逆置換IP:將明文數據用初始置換IP置換,得到一個亂序的64b明文分組,然後分組,經過16輪完全類似的迭代運算後,將所得的左右數據合併,最後使用初始逆置換IO置換,產生密文數據組。

初始置換

我們拿到的64為數據首先要進行初始置換,那麼我們拿到的應該是一組有含義的數據我們假設是64個0、1二進位流,那麼初始置換就是這些數據根據下表從新排列一邊,這一步是很簡單的,如我們對應下表,應該把源數據的第58個數據提到第一個位置,把第50個數據提到第二的數據,就是根據下表進行對應位置的轉換。

初始置換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

16輪迭代加密

上面基本已經講了,在這裡就說一下這個子密鑰的生成。
image

子密鑰的生成

密鑰為64位的密鑰,出去8位校驗位,剩餘的56位參與運算。
首先我們要用一個PC-1表把密鑰的8位校驗位去除,並且重新排序,這個和明文的初始置換是差不多的。
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

然後我們把著56位的密鑰,分為28位的兩組數據,染後根據移位次數表分別左移,如我們要求第一次的子密鑰,就把這兩組28位密鑰分別左移1位然後根據PC-2置換就是第一次的子密鑰了,求第二次的子密鑰就是在第一次的兩組上在分別左移2位,在用PC-2置換回來,就是k2了。不知道有有沒有寫明白。
image

第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

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

IP-1置換

把得到的R16和L16組合數據根據逆置換表置換就完成了。

逆置換IP-1

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

總結

我們得到64b的明文(不足64b的補足),我們首先使用IP置換處理一下明文,然後把他們分為兩組32b的數據,然後兩組數據進入16次迭代運算,16次迭代中每次有一組數據和一組子密鑰(48b)進行異或運算,首先要把數據進行E擴展變為48b數據,然後進行異或,在經過S盒壓縮處理,最後經過P置換,這就完成了F輪函數的過程,最後和另一組數據進行異或,完成一輪迭代,最後進行IP-1置換,完成加密,得到密文。