3DES的簡要原理和參考實現


3DES

分組密碼:對於明文編碼后的二進制序列,分組密碼會將其划分成長度固定的組(塊),每組分別在密鑰的控制下轉換成等長的密文分組。分組密碼算法的安全策略中,用得最多的就是采用代換-置換網絡(Substitution-Permutation Network),簡稱S-P網絡,是由S變化(代換)和P變化(置換或換位)交替進行多次迭代而形成的變換網絡。

Feistel結構:通過代換和置換(S-P網絡)交替的方式來構造分組密碼,該結構是可逆的,也可以用來解密,結構示意圖如下:

Feistel結構

加密算法輸入的是一個長度為2w比特的明文分組和一個密鑰K,明文分組被分成左右兩個部分\(L_0\)\(R_0\),數據的這兩個部分經過n輪的處理之后組合起來產生密文分組。第i輪將以第i-1輪的運算結果\(L_{i-1}\)\(R_{i-1}\)作為輸入,在對應的子密鑰\(K_i\)下,進行密碼轉換。一般地,\(K_i\)由主密鑰(初始密鑰)K輸入到密鑰拓展算法來產生。在Feistel網絡中,n輪結構都一樣,第i輪加密變化可用數學表達式描述如下:

\[\begin{cases} L_i = R_{i-1}, 1 <= i <= n \\ R_i = L_{i-1} \bigoplus F(R_{i-1}, K_i), 1 <= i <= n \end{cases} \]

其中函數F被稱作輪函數,一般包含代換和置換,起混亂和擴散的作用。因此,設計一個良好的非線性輪函數,對算法的安全性來說是很重要的。輪函數的輸出再和左半部分異或,得到下一輪的右半部分的輸入。

當Feistel結構用於解密時,第一輪的輸入是加密第n輪的輸出(密文),第j輪的輸入時加密過程第n-j+1輪的輸出,第n輪的輸入是加密過程第1輪的輸出,第n輪的輸出就是加密過程第1輪的輸入,即明文。解密變化可用數學表達式描述如下:

\[\begin{cases} R_{i-1} = L_i, 1 <= i <= n \\ L_{i-1} = R_i \bigoplus F(R_{i-1}, K_i) = R_i \bigoplus F(L_i, K_i), 1 <= i <= n \end{cases} \]

DES:采用Feistel結構,密鑰長度為64位,實際只使用56位(另外8位為奇偶校驗位),明文和密文的長度都是64位。簡化的示意圖如下:

DES

初始置換IP對明文的64位進行換位處理,然后通過子密鑰對明文進行16輪乘積變換,最后經過逆初始置換的處理,得到64位密文輸出。算法的開始和結束增加置換操作,可以增加算法的抗分析能力。初始置換IP表如下左圖。其含義為:明文中第58位變為第1位,明文中第50位變為第2位,…,明文中第1位變為第40位,…,明文中第7位變為第64位。逆初始置換則相反,再把順序調回去,像第40位變為第1位,表如下右圖。

IP-table

16輪迭代過程即使用前文的Feistel結構,每一輪變化的核心F函數包含三個子過程:擴展置換,S盒替換(壓縮)和P盒置換,將32位的輸入變為32位的輸出,結構如下左圖。擴展置換簡稱E函數(Expand),功能是把32位擴展成48位,是一個與密鑰無關的變換。擴展置換按32位輸入,分為8組,每組4位,經E函數擴展后變成每組6位輸出。E函數如下右圖,第一位輸入將會位於后續的第1和第8子分組中,這樣明文或密鑰的一點小變動,可以使密文產生較大變化。

F

擴展結果與子密鑰進行異或運算,結果作為S盒的輸入。壓縮替換(S盒)通過8個S盒將48位輸入變換為32位輸出,結構如下圖。

S

每個S盒都有4行16列,對於輸入的6個比特,第1和第6比特組成二進制的行號,第2到第5比特組成二進制的列號,由此確定的S盒的位置上的10進制數的4位二進制數即為輸出。舉例來說,輸入101001,行號11,列號0100,即第3行第4列。如果是S2的話,對應位置為3,輸出即為0011。

最后的P盒置換和前文的初始置換IP類似,會將S盒壓縮替換得到的32位結構重新排列順序,這就是F函數的最終輸出了,排列順序表就不貼了。

現在還有一個問題是怎么生成子密鑰,生成子密鑰的過程示意圖如下:

subkeys

64位初始密鑰中,只有56位是密鑰,剩下8位是奇偶校驗位(分布在8,16,24,32,40,48,56,64比特位置上)。子密鑰的生成大致有三個過程:置換選擇1,循環左移,置換選擇2,分別產生16個子密鑰。置換選擇1和前文P盒類似,打亂順序,還去掉密鑰中的奇偶校驗位。循環左移之前,前后28位各分成一組。循環左移的位置每一輪可能不同,在第1,2,9,16時,左移一個位置,其余左移兩個位置。置換選擇2也有一個表,用於從56位密鑰比特串中置換后送出48位比特。置換選擇1和置換選擇2的表分別如下的左圖和右圖。

PC1-PC2

DES使用了Feistel結構,解密可以使用同一個算法,所不同的是子密鑰的使用順序相反。但是,DES也存在一些問題,比如說56位的密鑰提供的安全性日益下降,S盒的設計原理未公開,可能隱含有陷阱等。現代常規分組加密算法中,一種是對DES進行復合,強化抗攻擊能力;另一種是開辟新方法。

中間相遇攻擊:對於雙重DES來說,有\(C=E_{K2} (E_{K1} (P))\)(其中C指密文,P指明文,E指加密,D指解密,K指密鑰),於是存在\(X=E_{K1} (P)=D_{K2} (C)\)

假設已知一個明文密文對(P, C),則可以先用\(K_1\)所有可能的\(2^{56}\)個密鑰加密P,並對結果按X的值排序保存。再遍歷\(K_2\)所有可能的\(2^{56}\)個密鑰解密C,如果有\(K_1\)\(K_2\)使得\(E_{K1} (P)=D_{K2} (C)\)成立,那么這兩個密鑰就有可能是正確的密鑰。而如果已知兩個明密文對的話,可能的概率可以達到\(1-2^{-16}\)。而且,中間相遇攻擊的代價(加密或解密所用運算次數)\(≤2×2^{56}\),比攻擊單DES所需的\(2^{55}\)多不了多少。

因為二重DES的密鑰長度理論上為112位,而64位的明文加密成64位的密文只有\(2^{64}\)種可能,所以一個明文到密文的變化對應着\(2^{112}/2^{64}=2^{48}\)種可能的密鑰。另一方面,對第一個明密文對成立的密鑰,使第二個明密文對成立的概率為\(1/2^{64}\)。那如果知道兩個明密文對,虛警率則降為\(2^{48-64}=2^{-16}\),或者說中間相遇攻擊的成功率為\(1-2^{-16}\)

3DES:由於2DES和4DES易受中間相遇攻擊的威脅,實用中一般廣泛采用的主要是三重DES方案,有四種使用模式,即:

  • DES-EEE3模式。使用三個不同密鑰\((k_1,k_2,k_3)\),采用三次加密算法。
  • DES-EDE3模式。使用三個不同密鑰\((k_1,k_2,k_3)\),采用加密-解密-加密算法。
  • DES-EEE2模式。使用兩個不同密鑰\((k_1=k_3,k_2)\),采用三次加密算法。
  • DES-EDE2模式。使用兩個不同密鑰\((k_1=k_3,k_2)\),采用加密-解密-加密算法。

前兩種的總密鑰長度達到了168位,后兩種的總密鑰長度為112位,有效克服了DES面臨的窮舉搜索攻擊,也增強了抗差分分析和線性分析的能力。

參考實現python

參考資料:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM