對稱密碼體制
對稱密碼體制:一種加密系統。其加密金鑰和解密金鑰是相同的,或者能夠從其中之一推知另一個。對稱密碼體制根據對明文加密方式不同分為分組密碼和流密碼。
分組密碼
分組密碼按照一定長度(如64bit、128bit)對名文分組,然後以組為單位進行加、解密。
分組密碼系統:對不同的組採用同樣的金鑰k來進行性加密、解密。
明文組:
密文:
分組密碼設計就是找到一種演算法,能在金鑰的控制下,從一個足夠大、足夠好的置換子集中簡單、迅速的選出一個置換、對當前輸入的明文數字組進行加密變換。
演算法要求:
- 分組長度足夠大,使得不同明文分組的個數2^n足夠大,以防止明文被窮舉法攻擊。
- 金鑰空間應足夠發,儘可能消除弱金鑰,從而使所有金鑰同等概率,以防窮舉金鑰攻擊,同時金鑰不能太長,以利於金鑰管理。
- 由金鑰確定的演算法要足夠複雜,充分實現明文與金鑰的擴散和混淆,沒有簡單的關係可循,要能抵抗各種已知的攻擊,差分攻擊、線性攻擊等。
- 要儘量使用適合程式設計的子塊和簡單的運算
- 加密解密應具有像是性。
分組密碼的一般結構
Feistel結構
- 明文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結構
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位資料組成一個迴圈的圈,那每一組都會有前驅和後繼了。
S盒壓縮處理
經過擴充的48位明文和金鑰進行異或運算後,再使用8個S盒壓縮處理得到32位資料。
- 將48位資料分為8塊,每6位壓縮為4位資料。
- 每一組資料取頭尾兩個陣列成一個二位二進位制數作為列,中間4位數對應行,找相應s和該位置資料就是轉換後的資料,如六位
011001
取第一位和第六位是01
那就是第一行,中間四位是1100
那就是第十二列,假設為第一組的資料那就去找S1盒的1行12列對應資料是9,那轉換後的資料就是1001
- 注意點:行和列對應的範圍是0-3和0-15.
- s盒對應表很容易在網上尋找,這裡我也複製下來了。
- 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盒置換表
DES
DES是分組長度為64b的分組密碼演算法。金鑰長度也是64b,其中每8b有一個奇偶校驗位,所以有效長度為56b。採用Feistel結構。
DES演算法框圖
初始置換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輪迭代加密
上面基本已經講了,在這裡就說一下這個子金鑰的生成。
子金鑰的生成
金鑰為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了。不知道有有沒有寫明白。
第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置換,完成加密,得到密文。