1. 程式人生 > >Feistel網路結構與DES加密演算法的框架簡單分析

Feistel網路結構與DES加密演算法的框架簡單分析

通常我們耳熟能詳的幾種加密演算法:
對稱金鑰/私鑰金鑰:DES、RC6、AES(Rijndael)
非對稱祕鑰/公鑰金鑰:RSA
單向雜湊函式:MD5、SHA

對於對稱金鑰與非對稱祕鑰加密演算法來說,其區別在於加密金鑰與解密祕鑰。若加密祕鑰與解密祕鑰相同或可互相推導/推算則為對稱金鑰(單鑰金鑰或私鑰金鑰),大多數對稱密碼演算法的加密金鑰與解密金鑰相同;不同且不可互相推導,則為非對稱祕鑰(雙鑰金鑰或公鑰金鑰)。由於加密祕鑰與解密金鑰相同,所以其結構就簡單的多。以Feistel結構來說其加密解密流程結構基本相同,而依據Feistel結構作為基本結構的有DES、RC6、MARS等加密演算法。

我們知道一個加密結果的好壞不僅取決於其加密密演算法的好壞(邏輯嚴謹性、效率等),還取決於其金鑰長度。由於DES的金鑰長度有效位為56bit(實際64bit,另外8bit是每個位元組的校驗位),所以其金鑰空間(數量)為N=2^56,對於現今的計算機CPU頻率來說,若採用暴力破解的方法來破解一個DES加密密文是不在話下的,並且3DES的產生與AES的產生都對DES有了完全替代的趨勢。但是對於研究Feistel網路結構來說,DES仍是最重要的一種加密演算法。所以研究Feistel網路結構一個重要的研究問題就是DES的基本加密流程。

1、Feistel網路結構加密解密流程:

Feistel的基本結構如下所示:
這裡寫圖片描述

round稱為輪,是加密的一個獨立的步驟,整個加密就是對同一步驟進行多次迴圈(DES選擇的是16輪迴圈)。輪數越多加密的效果越好,當然其加密時間也就越長。

其特性引數:

①明文(輸入)塊大小(Block Size):64bit~128bit,且是2的倍數;
②金鑰長度/大小(Key Size):56~256
③Number of Rounds:迴圈次數
④Round Function:輪函式,一定是非線性的,不要求可逆

我們拿出單獨的一輪(第一輪Round1)來看其一輪的加密流程:
這裡寫圖片描述


明文(Plaintext)長度為2W位(該結構加密的名文bit數長度必須為偶數,比如DES的明文長度為64bit)。

①先將2w位的明文分為左半部分(前w位L0)和右半部分(後w位R0)。
②將輸入的右側R0,直接輸出到輸出的左側為密文的左半部分L1。
③將輸入的右側R0與子金鑰K1進行F函式操作(K1和R0作為自變數)得到運算結果,即Output_1 = F(K1,R0)
④將經過F函式運算的結果Output_1與L0進行異或操作,得到結果作為密文的右半部分R1。
⑤第一輪Round1的密文作為第二輪Round2的明文進行相同步驟的加密操作,迴圈操作。
注意:最後一輪的結果在基本流程上(基本流程為下圖所示)要再交換左右兩部分(參照第一幅圖)。以保證加密與解密的結構相同。

一個基本的加密其輪流程如下所示:
這裡寫圖片描述
基本輪流程中,第i輪的輸入輸出分別為:

輸入:
Li-1 = Ri-2
Ri-1 = (Li-2)⊕F(Ri-2,Ki-1)
輸出:
Li = Ri-1 = (Li-2)⊕F(Ri-2,Ki-1)
Ri =(Li-1) ⊕ F(Ri-1,Ki) = (Ri-2) ⊕ F( [(Li-2)⊕F(Ri-2, Ki-1)], Ki)
很明顯這是一個迭代的過程。

兩個注意點:
①第一輪的左右兩部分輸入是由原有2W長度的資訊等分而來,其它輪的左右輸入是由上一步輸出得來。
②最後一輪的輸出在輸出以後需要進行一次左右交換,已達到加密解密同流程的目的。

Feistel網路結構有一個特點,就是加密與解密流程是完全相同的。也就是加密解密演算法相同,不同的只是初始輸入值與子金鑰的使用順序(即所謂加密解密對稱性)。
這裡寫圖片描述

金鑰使用:
加密時為:K1->K2->K3->…->Ki->…->Kn
解密時為:Kn->…->Ki->…->K3->K2->K1
輸入輸出:
加密時:輸入明文,輸出密文
解密時:輸入密文,輸出明文

2、Feistel網路結構的F函式:

對於Feistel網路結構,其加密核心在與F函式的選定,不同的F函式就是遵循Feistel結構的不同的加密演算法(如DES),一個好的F函式對於加密效果至關重要,一般情況下,F函式需要滿足以下幾點:
①不要求可逆:即不求F函式有反函式
②非線性;
③混亂性;
④擴散性;
⑤雪崩性:即隨著輪數增加其加密效果雪崩式增強;
⑥位元獨立性:一個bit的加密結果不依賴於其他bit。

3、DES演算法中的F函式:

DES加密演算法作為Feistel網路結構的一種應用,其F函式結構如下所示(綠色線內即DES的F函式流程):

這裡寫圖片描述
F函式的基本操作流程為:
(1)、將64bit的明文右半部分即32bit擴充套件為48bit:採用的是4個bit一組,分為8組,每一組前後各加1bit(增加的bit數=2*1*8=16bit)。其增加按照下表進行(虛線以外的為增加的bit所在位置,如:第一組前是32,即在第一組前加一個bit為整個右半部分的32bit的第32位的bit值{0,1}):
這裡寫圖片描述

用更加清晰地一張圖來體現:
這裡寫圖片描述
比如:原本的名文右半部分32bit為:

0101
1010
1001
1100
1010
0110
1001
1010
經過擴充以後為:
0 0101 1
1 1010 1
0 1001 1
1 1100 1
0 1010 0
0 0110 1
0 1001 1
1 1010 0

(2)、得到的48bit擴充資訊,和子金鑰Ki進行異或操作,得到48bit的結果;
(3)、將擴充資訊和子金鑰異或後的結果進行壓縮(48bit壓縮到32bit),壓縮的方式是經過S盒(4*16的矩陣)進行替換,S盒函式是經過嚴格計算獲得的,其S1盒的替換表與流程如下所示:
這裡寫圖片描述
一個組6bit,共8組(6bit*8=48bit),即有8個S盒,每個S盒是固定的但是都是不相同的。拿S1盒來說:B1B2B3B4B5B6,第一個位元和最後一個位元,即B1B6確定表中的行數(B1B6=00、01、10、11分別為0、1、2、3);每一組的中間四個位元確定列數(B1B2B3B4=0000~1111即0~15列)。
eg:B1B2B3B4B5B6=101011。則B1B6=11(3)確定最後一行,B2B3B4B5=0101(5)確定第5列。3行5列即值為9(1001),所以101011的6bit經過壓縮後的4bit為1001。這個替換的過程比較簡單,但是其核心S盒的設計是充滿了數學與密碼學智慧的。美國當初公佈DES演算法時沒有提出為什麼選擇這樣一個表來壓縮,只是給出了S盒的內容與使用。但是1976年NSA(NationalSecurityAgency)提出了S盒設計的幾條原則,基本內容如下:
這裡寫圖片描述

S盒的實現就像一個編碼器,只不過是6-4線的。而不是8-3線或者16-4線的。更準確來說是一個索引表,原來的6bit作為索引,轉換為索引到的4bit。

S盒的設計原則是遵循了F函式的要求來設計的,比如非線性、雪崩性、位元統計獨立性等。對於S盒的分析,這裡不進行研究,感興趣的朋友可以百度S盒的設計準則與分析,或參考:DES中S盒設計準則的分析

(4)、置換運算P(經過一個P盒進行置換):指的是將32bit壓縮後的資訊進行bit置換操作,改換位操作目的是打亂其原有排序規律(F函式的混亂性原則)。P盒與S盒的硬體設計規律如下圖所示(P盒是打亂原有01序列,S盒是譯碼器+P盒+編碼器構成的(以8-3線為例)):
這裡寫圖片描述
而關於DES的F函式中的P盒設計,這裡也不做研究,僅僅是瞭解學習一下DES的F函式的流程而已(DES中不僅F函式中有P盒存在,子金鑰的產生過程中也存在P盒,關於子金鑰的產生我們在以後的DES演算法具體剖析中再來分析)。

經過以上四步,就完成了DES加密中重要的F函式的操作,經過分析我們發現,F函式的基本流程並不複雜,其複雜點(或者說演算法精要)是32bit擴充48bit的思想、S盒設計思想、P盒設計。對於這些問題的分析與設計是需要豐富的密碼學經驗的,並且由嚴謹的數學、邏輯學推導。或許有人懷疑S盒的設計中存在“後門”,但就目前來看這一猜想是不成立的。

3、設計簡單的F函式測試加密解密過程:

由於DES的F函式過於複雜,且明文與金鑰長度過長,不便進行測試,所以,我們自行設計一個F函式:
F(Ri-1,Ki)=(Ri-1)⊕(Ki)
明文塊長度(Block Size)為8bit,子金鑰長度為4bit,要加密的資訊是1100 0010。
假設K1=1111,K2=1110共進行兩輪加密。

(1)、加密:

明文:1100 0010作為最初輸入 —>L0 = 1100,R0 = 0010
Round 1:
K1 = 1111
L1 = R0 = 0010
R1 = L0⊕F(R0,K1)=L0⊕(R0⊕K1)=1100⊕(0010⊕1111)=1100⊕1101=0001
Round 2:
K2 = 1110
L2 = R1= 0001
R2 = L1⊕F(R1,K2)=L1⊕(R1⊕K2)=0010⊕(0001⊕1110)=0010⊕1111=1101
最後一輪L2、R2交換:
加密完成後的密文:1101 0001(與加密前明文相同)

(2)、解密:

密文:1101 0001最初作為輸入 —> L0 = 1101,R0=0001
Round 1:
K2 = 1110
L1 = R0 = 0001
R1 = L0⊕F(R0,K2)=L0⊕(R0⊕K2)=1101⊕(0001⊕1110)=1101⊕1111=0010
Round 2:
K1 = 1111
L2 = R1= 0010
R2 = L1⊕F(R1,K1)=L1⊕(R1⊕K1)=0001⊕(0010⊕1111)=0001⊕1101=1100
最後一輪L2、R2交換:
解密完成後的明文:1100 0010

用該簡單的例子,驗證了加密解密用同一個流程的可行性。這也是Feistel網路結構的一個十分重要的特性,不必為解密單獨再實現軟體/硬體,而AES(Rijndael)演算法的加密解密流程就不同(是相反的),需要單獨實現解密軟體、硬體。並且我們發現在DES的加密操作中位運算比較多,用硬體實現DES比軟體實現似乎效率更高,加密速度更快。

視訊學習資源來源:(資訊保安概論-中國農業大學-呂春利)http://www.icourse163.org/course/CAU-251001#/info
個人推薦圖書資源:
(1)、《應用密碼學–協議演算法與C源程式》[美]Bruce Schneier著 ,機械工業出版社。
(2)、《圖解密碼技術》[日]結城浩著,人民郵電出版社