分組密碼是將明文消息編碼表示後的數字序列劃分紅長爲n的組,每一個組(可稱爲長度爲n的矢量)分別在密鑰控制下變換成等長的輸出數字序列。
其加密函數E:V_n × K → V_m。 其中V_n和V_m分別爲n維和m維的矢量空間,K爲密鑰空間。它與流密碼不一樣之處在於輸出的每一位數字不是隻與相應時刻輸入的明文數字有關,而是與一組長爲n的明文數字有關。這種密碼實質上是字長爲n的數字序列的代換密碼。算法
Feistel提出利用乘積密碼可得到簡單的代換密碼,乘積密碼指順序地執行兩個或多個基本密碼系統,使得最後的密碼強度高於每一個基本密碼系統產生的結果。其思想其實是Shannon提出的利用乘積密碼實現混淆和擴散思想的具體應用。安全
加密算法的輸入是分組長爲2w的明文和一個密鑰k,將每組明文分紅左右兩半L和R,在進行完n輪迭代後,左右兩半再合併到一塊兒產生密文分組。第i輪迭代的前一輪輸出的函數:網絡
L_i = R_{i-1}
R_i = L_{i-1} xor F(R_{i-1}, k_i)函數
解密過程本質上和加密過程是同樣的,算法使用密文做爲輸入,但使用子密鑰K_i的次序與加密過程相反。這一特徵保證瞭解密和加密可採用同一算法。編碼
明文分組長度爲64比特,密鑰長度爲56比特。在加密過程當中將有三個階段:加密
這裏須要注意的是,不管是初始置換仍是最終的逆初始置換,都不能增減DES的安全性。其設計的初衷並不被人所知,可是看起來其目的是將明文從新排列,使之適應8-bit寄存器。其映射規則以下:矩陣爲8×8矩陣,自左至右,自上至下依次排位,矩陣中的某次位數目即爲明文中該次位的比特值映射到buffer的偏移量。設計
f函數在DES的安全性中起到了相當重要的做用,f函數的做用是將上一輪的右半邊的結果,以及該輪所得到的密鑰做爲輸入數據,輸出結果是經過異或操做來加密。it
在f函數最開始時,首先將32-bit數據擴展爲48-bit數據,參照的方法爲經過E矩陣進行擴展。擴展(或稱爲映射)方法與IP形似。io
第二步,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是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密鑰首先將會分紅兩部分,這兩部分將會各自循環移位。其移位規則以下:
咱們能夠發現,16輪事後,兩個子部密鑰正好旋轉了28-bit,即旋轉一週。
在每一輪中,爲了生成48-bit子密鑰,須要進行子置換,其輸入數據爲旋轉後獲得的密鑰捨去8-bit,然後再用一個6×8的矩陣進行置換,置換規則如上所述。因此,56-bit的密鑰中每一位,都會在16輪中的14輪裏使用到。
DES的解密和加密使用同一個算法,可是子密鑰使用的順序倒是相反的
所以在解密過程當中,子密鑰的循環移位規則與加密過程有不一樣
而在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的四種運行模式: