Categories
密碼學 All

密碼學(2): Modern Block Ciphers

Block Ciphers 可以譯作分組加密或者分塊加密。

常用 Block Ciphers 相提并論的加密方式是 Stream Ciphers,可譯作串流加密法。兩者都是替換式密碼(Substitution ciphers),都應用了可逆映射(reversible mapping):

Stream Ciphers

串流加密法是一種對稱密鑰密碼,其中明文數字與偽隨機密碼數字流(密鑰流)相結合。在實踐中,一個數字通常是一個 bit,與異或 (XOR)組合操作,把明文訊息逐個 bit 轉換成密文。

典型的 Stream Ciphers 是自動加密的 Vigenère 密碼和 Vernam 密碼。

較有名的 Stream Ciphers 是 RC4。

RC4

RSA DSI 擁有的專有密碼,由 Ron Rivest 設計,簡單但有效。密鑰大小可變,是一種面向字節的串流加密法。在 SSL/TLS、無線 WEP 中廣泛使用。密鑰形成所有 8-bit 的隨機排列,使用該排列來打亂輸入信息,一次處理一個字節。

RC4 Key Schedule:

  • 以數字數組 S 開頭:0..255
  • 使用鍵來完全地打亂
  • S 形成密碼的內部狀態
  • 給定一個長度為 keylen 個字節的密鑰 K:
for i= 0 to 255 do
   S(i) = i
   T(i) = K(imod keylen)
   j = 0
for i= 0 to 255 do 
   j = (j + S(i) + T(i)) mod 256 
   swap (S(i), S(j))

RC4 加解密:

  • 加密繼續打亂數組值。
  • 已打亂的每對的總和選取 stream key 值。
  • 與要加密/解密的下一個消息字節進行異或(XOR)運算:
i= j = 0 
for each message byte Mi
   i= (i+ 1) mod 256
   j = (j + S(i)) mod 256
   swap(S(i), S(j)) //keep shuffling 
   S()t = (S(i) + S(j)) mod 256
   Ci= Mi⊕S(t)

RC4 的安全性:

  • 聲稱對已知攻擊安全(有一些分析,沒有實踐)。
  • 結果是非常非線性的。
  • 由於 RC4 是一種串流加密法,絕不能重複使用密鑰。
  • 對 WEP 有疑慮,但這部分由密鑰處理而不是 RC4 本身。

Block Ciphers

明文區塊被視為一個整體,用於生成等長(64 / 128 位)的密文區塊。

密鑰長度/區塊大小/輪數可變。

混合運算符,數據。

費斯妥密碼(Feistel cipher) 是一種用於構造 Block Ciphers 的對稱結構,以 Horst Feistel 命名。

Feistel 提出我們可以利用乘積密碼的概念來逼近理想的分組密碼,即依次執行兩個或多個簡單密碼。

替代:每個明文元素或元素組唯一地被相應的密文元素或元素組替換。

排列:明文元素的序列被該序列的不同排列替換。 也就是說,序列中沒有元素被添加、刪除或替換,而是元素在序列中出現的順序發生了變化。

Feistel 加解密:

數據加密標準 Data Encryption Standard (DES):

一種用於加密數字數據的對稱密鑰算法,於 1970 年代初在 IBM 開發。儘管其 56 bits 的短密鑰長度使其對應用程序來說太不安全,它對密碼學的進步產生了很大的影響。

Key size – 56 bits; Block size – 64 bits

DES 算法:

DES 加密:

Electronic Codebook (ECB):

消息被分成獨立的區塊,這些區塊被加密。每個區塊都是一個被替換的值,就像一個密碼本,因此得名。每個區塊都獨立於所有其他區塊。

Ci = De (Pi, K1)

ECB 的優劣:

  • 重複的消息可以反映在密文中。
  • 如果與消息區塊對齊,特別是與圖形等數據或變化很小的消息對齊,這將造成密碼書分析問題。
  • 加密消息區塊是獨立的,這是一個弱點。
  • 因此只有真正發送幾個數據區塊時很有用。

Cipher Block Chaining (CBC):

消息被分成多個區塊,但它們在加密操作中是聯繫在一起的。密碼區塊與明文鏈接,因此得名。

使用已知的初始向量 (IV) 開始流程:

  • Ci= En (Pi⊕Ci-1, K1)
  • C0= IV

CBC 的優劣:

  • 每個密文區塊依賴於它之前的所有消息區塊。
  • 最常見的使用模式,消息的更改會影響密文區塊以及原始區塊。
  • 爲了開始流程,需要一個初始值 (IV),發送方和接收方都必須知道它,IV 必須是一個固定值,或者它可以在消息的其餘部分之前以 ECB 模式加密發送。
  • 在消息的最後,必須處理一個可能出現的最後一個短區塊:用 pad 填充最後一個區塊(通常帶有填充大小的計數),Eg. [b1 b2 b3 0 0 0 0 5] ➔3 data bytes and 5 bytes pad+count

Cipher Feedback (CFB):

消息被視為添加到分組密碼輸出的比特流,結果是下一階段的反饋(因此得名)。標准允許反饋任意數量的 bit(1、8 或 64 或其他),表示為 CFB-1、CFB-8、CFB-64 等。

在實踐中,利用所有 64 位是最有效的,稱之為 CFB-64:

  • Ci= Pi⊕Sig(En(Pi, K1))
  • C0= IV

CFB 的優劣:

  • 當數據固有地以位/字節到達時適用。
  • 最常見的流模式。
  • 分組密碼在兩端都用於加密模式。
  • 錯誤在發生之後仍傳播了幾個區塊。

Output Feedback (OFB):

消息被視為比特流,分組密碼的輸出被添加到消息中, 然後反饋(因此得名)輸出,因此反饋與消息無關。

可以提前計算:

  • Ci= Pi⊕Oi
  • Oi= Si( En(Oi-1, K1))
  • O0= IV

OFB 的優劣:

  • 用於錯誤反饋有問題的地方。
  • 沒有錯誤傳播,或者在消息可用之前必須進行加密。
  • 與 CFB 類似,但反饋來自分組密碼的輸出,並且與消息無關。
  • 永遠不要重複使用相同的序列(key + IV),發送者和接收者必須保持同步,並且需要一些恢復方法來確保這種情況發生。
  • 雖然最初在標準中指定了 m-bit 的反饋,但隨後的研究表明,應該只使用 64 位 OFB,這是最有效的方式。