Brute-Force-Attack

Blowfish 中的迭代密鑰擴展能否減緩對小密鑰大小的暴力攻擊?

  • August 28, 2012

假設我必須使用 64 位密鑰進行加密(例如遵守出口限制)。對於這個問題,假設這個密鑰是真正隨機的,加密算法是 Blowfish。

Blowfish 密鑰調度將此 8 字節密鑰擴展為 4168 字節的狀態(P-array 和 S-box)。如果我執行這個擴展大量的回合,它會減慢蠻力攻擊嗎?

REPEAT rounds
  state := ExpandKey(state, key)
END

(基本上,該方案類似於 bcrypt,如果你扔掉鹽而不是加密一個常量來派生密鑰,而是使用最終狀態進行實際加密。)

是否有任何其他比蠻力更快的對此類方案的實際攻擊?

與您建議的類似的東西已被稱為“昂貴的密鑰計劃 Blowfish”或“EksBlowfish”。它是 Bcrypt(為密碼散列設計的慢速散列函式)核心中的加密算法。

它還包含一個鹽,它的設置功能是這樣的(從論文中重新輸入):

EksBlowfishSetup(cost, salt, key):
  state ← initState()
  state ← ExpandKey(state, salt, key)
  repeat(2^cost):
     state ← ExpandKey(state, 0, salt)  
     state ← ExpandKey(state, 0, key)
  return state

InitState()與 Blowfish 中的相同:它用數字填充 P 和 S 框 $ \pi $ . ExpandKey(state, 0, ...)也像 Blowfish 的密鑰擴展功能一樣工作 - 它使用(重複版本)密鑰對 P-box 進行異或,然後使用 Blowfish(使用現有狀態)在 CBC 模式下加密零流,用每個塊加密後的結果。帶有鹽參數的版本只是使用這個鹽(重複)作為原始值進行加密。

EksBlowfish 的實際加密就像普通的 Blowfish 加密一樣工作。在 Bcrypt 中,這用於加密(在 ECB 模式下為 64 次)3 塊 ASCII 字元串OrpheanBeholderScryDoubt以生成 bcrypt 散列,但您也可以單獨使用 EksBlowfish。

它不會比“普通”的 Blowfish 更糟,並且像具有相同成本因素的 bcrypted 密碼一樣難以破解。我想您可以使用恆定的鹽,但是使用隨消息傳遞的一些隨機(但不是秘密)鹽看起來更好(並且避免了預計算)。如果您的性能很關鍵,您當然不應該在每個 SSL 數據包中更改鹽。


Blowfish 還有一個問題:它只有 64 位塊,因此不能比任何 64 位塊密碼更安全。之後可能會出現重複塊 $ 2^{32} $ 塊(即 32 GB),這可能足夠或不夠,取決於您的應用程序。並且重複的塊給出了攻擊點。

您可以考慮改用 128 位分組密碼(如 AES),並從“短”64 位密鑰中使用 bcrypt 派生您的密鑰。

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