分組密碼體制

分組密碼是將明文消息編碼表示後的數字序列劃分紅長爲n的組,每一個組(可稱爲長度爲n的矢量)分別在密鑰控制下變換成等長的輸出數字序列。
其加密函數E:V_n × K → V_m。 其中V_n和V_m分別爲n維和m維的矢量空間,K爲密鑰空間。它與流密碼不一樣之處在於輸出的每一位數字不是隻與相應時刻輸入的明文數字有關,而是與一組長爲n的明文數字有關。這種密碼實質上是字長爲n的數字序列的代換密碼。算法

混淆和擴散

  1. 混淆(Confusion) 是一種加密操做,使得密鑰與密文之間的關係變得模糊(經過代換器來完成,即S盒)
  2. 擴散(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比特。在加密過程當中將有三個階段:加密

  1. 一個初始置換IP,用於從新排列明文分組的64比特數據。
  2. 進行具備相同功能的16輪變換,每輪變換中都有置換和代換運算,在第16輪變換的輸出後,將結果分紅左右兩半,並交換次序。
  3. 最後再通過一個逆初始置換逆IP從而產生64比特密文。

這裏須要注意的是,不管是初始置換仍是最終的逆初始置換,都不能增減DES的安全性。其設計的初衷並不被人所知,可是看起來其目的是將明文從新排列,使之適應8-bit寄存器。其映射規則以下:矩陣爲8×8矩陣,自左至右,自上至下依次排位,矩陣中的某次位數目即爲明文中該次位的比特值映射到buffer的偏移量。設計

f函數

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的設計有如下特性:

  1. 每個s-box都是以6-bit數據做爲輸入,4-bit數據做爲輸出
  2. 輸出數據與輸入數據無線性關係
  3. 若是6-bit數據中最高位與最低位的值是肯定的,剩餘四位是變化的,則輸出的4-bit數據不得出現重複
  4. 若是輸入到s-box中的數據中有一位不一樣,則輸出的數據必需要求至少有兩位不一樣
  5. 若是輸入到一個s-box中的兩個數據有在中間比特位上有兩個不一樣,那麼輸出數據必須至少有兩位不一樣
  6. 若是輸入到一個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輪時,兩個子部密鑰向左循環移位1-bit
  • 在其它輪時,兩個子部密鑰向左循環移位2-bit

咱們能夠發現,16輪事後,兩個子部密鑰正好旋轉了28-bit,即旋轉一週。

在每一輪中,爲了生成48-bit子密鑰,須要進行子置換,其輸入數據爲旋轉後獲得的密鑰捨去8-bit,然後再用一個6×8的矩陣進行置換,置換規則如上所述。因此,56-bit的密鑰中每一位,都會在16輪中的14輪裏使用到。

解密過程

DES的解密和加密使用同一個算法,可是子密鑰使用的順序倒是相反的

所以在解密過程當中,子密鑰的循環移位規則與加密過程有不一樣

  • 在第1輪時,密鑰不進行循環移位
  • 在第二、九、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的四種運行模式:

  1. 電碼本(ECB)模式:每一個明文組獨立地以同一個密鑰進行加密,用於傳送短數據
  2. 密碼分組連接(CBC)模式:加解密算法的輸入是當前明文組與前一個密文組的異或,用於傳送數據分組和認證
  3. 密碼反饋(CFB)模式:每次只處理輸入的比特,將上次密文用做加密算法的輸入,用以產生僞隨機輸出,再將該輸出與當前明文異或獲取當前密文,主要用於傳送數據流和認證
  4. 輸出反饋(OFB)模式:與CFB相似,但本次加密算法的輸入爲前一次加密算法的輸出,主要用於在有干擾信道上的數據流傳送。
相關文章
相關標籤/搜索