DES采用了64位的分組長度和56位的密鑰長度,是對稱加密的一種。
DES的理論進化主線是 1945年Shannon大神提出的交替使用混淆(使密文與密鑰的統計關系變復雜)和擴散(使明文與密文的統計關系變復雜)的乘積密碼(DES加密的核心思想)-->1960s的Feistel結構-->DES。實踐主線是 1971年基於Feistel結構的LUCIFER算法-->Tuchman-Mayer方案(將LUCIFER的128位密鑰簡化為56位)-->1977年被采納的DES(增加S盒,產生非線性)。
下圖為DES加密的整個機制。
DES加密操作分兩塊,明文加密以及生成子密鑰兩部分。
上圖左半部分描述了明文加密成密文的三個階段。
1、64位的明文經初始置換(IP)而重新排列。
2、進行16輪的置換和轉換(基於Feistel結構)。
3、再做一次置換(IP-1,與初始置換互逆)。
可逆驗證 M=IP-1{F[IP(P)]}
IP-1{F[IP(M)]}= IP-1{F[IPIP-1{F[IP(P)]}]}=IP-1{FF[IP(P)]}=IP-1IP(P)=P
結論,加密和解密的過程基本一致(F函數代表16輪轉換的整體效果,實際上子密鑰在加密和解密中順序是相反的)
上圖右半部分是56位密鑰的操作過程。
1、密鑰先做一個置換。
2、再做16次包含循環左移和置換的操作組合,每次都產生一個子密鑰Ki。每一輪的置換操作都完全相同,但由於循環左移而使得每個子密鑰不同。
下面介紹初始置換及其逆置換。
如上表,分別代表初始置換和初始置換的逆置換。表中數字包含1-64,代表輸入的64位分組的每一比特在置換輸出后的位置。
很顯然,以上兩個置換確實是可逆的,如明文分組的第1位經初始置換后出現在第58位,而逆置換的第58位將輸出到第1位。
這個置換的原理實際上是對置換群的可逆操作。
Feistel結構的加密與解密
Feistel結構的加密算法將明文分組分成等長的左右兩部分,這兩半經過n輪迭代后組成密文分組。每一輪的迭代操作都完全相同,解密過程本質上與加密過程操作是一致的,只是子密鑰的使用順序與加密過程完全相反。因此,為了研究加密與解密過程的可逆性,可將問題簡化為只有一輪的迭代,如下圖。
feistel結構的可逆性,其運用的數學原理是異或的幾個基本性質
[A⊕B]⊕C=A⊕[B⊕C]
A⊕A=0
A⊕0=A
以 i 輪為例
加密時有 解密時有
Li=Ri-1 Li’=Ri-1‘ ==> Li’=Li=Ri-1
Ri=Li-1⊕F(Ri-1,Ki) Ri’=Li-1‘⊕F(Ri-1’,Ki) ==> Ri’=Ri⊕F(Li,Ki)=Li-1⊕F(Ri-1,Ki)⊕F(Ri-1,Ki)=Li-1
結論:每輪加密和解密的中間結果都完全一樣,且與F函數無關。而F函數越復雜,Ri與Li-1的關系越復雜,因而越難被破解。
DES第二階段每輪變換的詳細過程
由於輪密鑰長48位,R是32位,首先要將R進行置換擴展為48位,其中有16位是重復的,如用下表進行置換擴展。
然后將擴展后的48位與輪密鑰進行異或,所得結果再用一個替代函數作用(S盒)並輸出32位。下圖解釋了S盒在函數F中的作用。
代替函數由8個S盒組成,S盒的變換參見下表。
每個S盒都輸入6位,輸出4位。盒Si輸入的第1位和最后1位組成一個2位的二進制數,用來選擇S盒4行代替值中的一行,中間4位用來選擇16列中的某一列。行列交叉處的十進制轉換為二進制之后可得到輸出的4位二進制數。
S盒實現了非線性的特性。通過S盒,不同的輸入可以有相同的輸出,進一步增加了明文與密文之間的映射關系的復雜度,使得破解更加艱難。
最后再做一次置換后輸出,該置換例子如下表。
密鑰產生
1、首先輸入64位密鑰,密鑰各位分別標記為1-64。從64位中選擇56位作為有效密鑰,如選擇下表陰影部分。
2、將所得56位有效密鑰進行置換並划分成等長的兩部分C0和D0,如下表。
3、每輪進行迭代時,Ci-1和Di-1分別循環左移一位或者兩位,具體移位數見下表。
4、對移位后的值再做一次置換,如下表。