分組密碼是將明文消息編碼表示后的數字序列划分成長為n的組,每個組(可稱為長度為n的矢量)分別在密鑰控制下變換成等長的輸出數字序列。
其加密函數E:V_n × K → V_m。 其中V_n和V_m分別為n維和m維的矢量空間,K為密鑰空間。它與流密碼不同之處在於輸出的每一位數字不是只與相應時刻輸入的明文數字有關,而是與一組長為n的明文數字有關。這種密碼實質上是字長為n的數字序列的代換密碼。
混淆和擴散
- 混淆(Confusion) 是一種加密操作,使得密鑰與密文之間的關系變得模糊(通過代換器來完成,即S盒)
- 擴散(Diffusion) 是一種加密操作,使得一個明文符號能夠分散為多個密文符號,其目的是隱藏明文字符出現次數的統計概率。
Feistel密碼結構
Feistel提出利用乘積密碼可獲得簡單的代換密碼,乘積密碼指順序地執行兩個或多個基本密碼系統,使得最后的密碼強度高於每個基本密碼系統產生的結果。其思想實際上是Shannon提出的利用乘積密碼實現混淆和擴散思想的具體應用。
Feistel加密結構
加密算法的輸入是分組長為2w的明文和一個密鑰k,將每組明文分成左右兩半L和R,在進行完n輪迭代后,左右兩半再合並到一起產生密文分組。第i輪迭代的前一輪輸出的函數:
L_i = R_{i-1}
R_i = L_{i-1} xor F(R_{i-1}, k_i)
Feistel解密結構
解密過程本質上和加密過程是一樣的,算法使用密文作為輸入,但使用子密鑰K_i的次序與加密過程相反。這一特征保證了解密和加密可采用同一算法。
DES算法描述
明文分組長度為64比特,密鑰長度為56比特。在加密過程中將有三個階段:
- 一個初始置換IP,用於重新排列明文分組的64比特數據。
- 進行具有相同功能的16輪變換,每輪變換中都有置換和代換運算,在第16輪變換的輸出后,將結果分成左右兩半,並交換次序。
- 最后再經過一個逆初始置換逆IP從而產生64比特密文。
這里需要注意的是,無論是初始置換還是最終的逆初始置換,都不能增減DES的安全性。其設計的初衷並不被人所知,但是看起來其目的是將明文重新排列,使之適應8-bit寄存器。其映射規則如下:矩陣為8×8矩陣,自左至右,自上至下依次排位,矩陣中的某次位數目即為明文中該次位的比特值映射到buffer的偏移量。
f函數
f函數在DES的安全性中起到了至關重要的作用,f函數的作用是將上一輪的右半邊的結果,以及該輪所獲得的密鑰作為輸入數據,輸出結果是通過異或操作來加密。
在f函數最開始時,首先將32-bit數據擴展為48-bit數據,參照的方法為通過E矩陣進行擴展。擴展(或稱為映射)方法與IP形似。
第二步,48-bit的結果將會按位與該輪對應的子密鑰(48位)異或。
第三步,將48-bit數據切分成8個6-bit數據,分別作為8個不同的代換盒子(s-box)的輸入數據,s-box用於實現代換操作。每一個s-box包含64個實體,存放於4×16的矩陣之中。其代換規則如下:取6-bit數據中最高位比特數以及最低位比特數作為行數,剩余四位在中間的比特數作為列數,由此可以取出s-box中某行某列的數,該數為0-15之間,即輸出結果為4-bit數據。
對於s-box的設計有以下特性:
- 每一個s-box都是以6-bit數據作為輸入,4-bit數據作為輸出
- 輸出數據與輸入數據無線性關系
- 如果6-bit數據中最高位與最低位的值是確定的,剩余四位是變化的,則輸出的4-bit數據不得出現重復
- 如果輸入到s-box中的數據中有一位不同,則輸出的數據必須要求至少有兩位不同
- 如果輸入到一個s-box中的兩個數據有在中間比特位上有兩個不同,那么輸出數據必須至少有兩位不同
- 如果輸入到一個s-box中的兩個數據在頭兩個比特位上有不同,在最后兩位上相同,那么兩個輸出數據必須不同
s-box是DES加密中最重要的元素,因為他們實現了非線性加密 : S(a) xor S(b) != S(a xor b)
子密鑰生成器
輸入DES的56-bit密鑰首先要經過一個置換運算,其置換規則與上文IP矩陣類似。這里需要首先明確一點,DES的輸入密鑰通常是64-bit的,真實的56-bit密鑰生成的算法是:將64-bit分成8組,每組8-bit,僅取每組前7-bit組成56-bit密鑰。每個子密鑰是為48-bit。
56-bit密鑰首先將會分成兩部分,這兩部分將會各自循環移位。其移位規則如下:
- 在第1、2、9、16輪時,兩個子部密鑰向左循環移位1-bit
- 在其它輪時,兩個子部密鑰向左循環移位2-bit
我們可以發現,16輪過后,兩個子部密鑰正好旋轉了28-bit,即旋轉一周。
在每一輪中,為了生成48-bit子密鑰,需要進行子置換,其輸入數據為旋轉后得到的密鑰舍去8-bit,而后再用一個6×8的矩陣進行置換,置換規則如上所述。所以,56-bit的密鑰中每一位,都會在16輪中的14輪里使用到。
解密過程
DES的解密和加密使用同一個算法,但是子密鑰使用的順序卻是相反的
因此在解密過程中,子密鑰的循環移位規則與加密過程有不同
- 在第1輪時,密鑰不進行循環移位
- 在第2、9、16輪時,兩個子部密鑰向右循環移位1-bit
- 剩余輪時,兩個子部向右循環移位2-bit
而在Feistel網絡中的解密解析如下:
我們可以分析得出:
解密L0 = 加密R16
解密R0 = 加密L16 = 加密R15
解密L1 = 解密R0 = 加密L16 = 加密R15
解密R1 = 解密L0 xor f(解密R0, k16) = 加密R16 xor f(加密L16, k16) = (加密L15 xor f(加密R15, k16)) xor f(加密R15, k16) = 加密L15
如此,可以推算出解密算法可逆。
分組密碼運行模式
分組密碼在加密的時候,明文分組長度是固定的,但在實際應用過程中往往難以保證明文的長度。因此為了能在各種場合使用DES,定義了DES的四種運行模式:
- 電碼本(ECB)模式:每個明文組獨立地以同一個密鑰進行加密,用於傳送短數據
- 密碼分組鏈接(CBC)模式:加解密算法的輸入是當前明文組與前一個密文組的異或,用於傳送數據分組和認證
- 密碼反饋(CFB)模式:每次只處理輸入的比特,將上次密文用作加密算法的輸入,用以產生偽隨機輸出,再將該輸出與當前明文異或獲取當前密文,主要用於傳送數據流和認證
- 輸出反饋(OFB)模式:與CFB類似,但本次加密算法的輸入為前一次加密算法的輸出,主要用於在有干擾信道上的數據流傳送。