Stream-Cipher

兩個流密碼的組合

  • August 24, 2017

最近,我一直想知道當我結合兩個流密碼時會發生什麼 $ f_1 $ 和 $ f_2 $ 通過對密鑰流進行異或運算,最終的密碼將是:

$ C = P \oplus f_1(K_1) \oplus f_2(K_2) $

$ P = C \oplus f_1(K_1) \oplus f_2(K_2) $

顯然,密鑰流不應該相同,因為它們會相互協商,所以一些場景不應該適用:

  1. $ f_1 = f_2 $ 和 $ K_1 = K_2 $ 因為他們顯然會創建相同的密鑰流。
  2. $ f_1 = f_2 $ 和 $ K_1 \neq K_2 $ 但那裡 $ f $ 不安全並且 $ K_1 $ 和 $ K_2 $ 是相關密鑰攻擊的一部分,所以 $ f $ 產生相同的密鑰流。
  3. 真的倒霉嗎?

另一個想法是,只要沒有相關的密鑰,該組合就可以用來將密鑰長度加倍。也鑑於 $ f_1 \neq f_2 $ 並且攻擊者只能計算兩者之一的密鑰流,他將剩下 $ C \oplus f_\mathit{other}(K) $ 使組合與使用的最安全密碼一樣安全。

最後,我的最後一個想法是,當 LFSR 組合時,這種模式已經在流密碼(例如 A5/1)中使用,因此它們可能是安全的?

這種組合很容易受到中間相遇攻擊。讓我們從您的一個方程式開始:

$$ C = P \oplus f_1(K_1) \oplus f_2(K_2) $$ 如果我們異或 $ f_1(K_1) $ 對雙方,我們得到:

$$ C \oplus f_1(K_1) = P \oplus f_2(K_2) $$ 現在,如果我有一個已知的明文/密文對 $ P, C $ ,為了攻擊密碼,我可以進行中間相遇攻擊:

  1. 我建立了一個值的表 $ C \oplus f_1(K_1), K_1 $ 對於所有可能的值 $ K_1 $ . 這需要的時間和記憶體與 $ 2^{|K_1|} $ .
  2. 對於每個可能的值 $ K_2 $ 我計算相應的 $ P \oplus f_2(K_2) $ ,並從步驟 #1 開始在表格中查找。如果我找到匹配項,我會記錄下來 $ K_1, K_2 $ 組合作為候選鍵。

現在密鑰必須是候選密鑰之一,而且只花了我 $ 2^{|K_1|} + 2^{|K_2|} $ 是時候找出來了,不是 $ 2^{|K_1| + |K_2|} $ ——組合密碼比密鑰長度總和的密碼弱得多。

(請注意,可以有多個候選鍵。任何 $ K’_1, K’_2 $ 這樣:

$$ f_1(K’_1) \oplus f_2(K’_2) = f_1(K_1) \oplus f_2(K_2) $$ …也是候選鍵。但是你可以打賭候選鍵的數量會比鍵的數量少得多。)

引用自:https://crypto.stackexchange.com/questions/51072