淺析DES原理

airl發表於2022-03-29

對稱密碼體制

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

分組密碼

分組密碼按照一定長度(如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置換,完成加密,得到密文。

相關文章