使用弱散列函式構造流密碼
我處於開發安全加密方案的尷尬境地,該方案為非常有限的嵌入式系統提供靜態數據安全性。系統只保證有 4 MiB 的記憶體(有些系統有額外的 32 MiB),甚至沒有 MMU。他們正在執行舊版本的 μClinux。雖然資源不是什麼大問題(即使是便宜的 8051 也可以執行安全密碼),但真正的問題是我只能使用系統上存在的實用程序。不幸的是,除了相當有限的 shell 之外,沒有其他腳本語言
ash
,因此實現真正的流密碼是不可能的。但是,該md5sum
實用程序存在,因為od
這是將密鑰流與二進制流的明文組合所必需的。因為在 shell 中實現流密碼
ash
會太慢,所以我想到了使用 MD5,其中密鑰流 $ H $ 在位置 $ i $ 是鍵的雜湊 $ K $ , 隨機數 $ N $ , 和計數器 $ i $ 串聯。明文加密 $ P $ 和密文的解密 $ C $ 就像在任何流密碼中一樣完成。$$ \begin{align*} C_i &= P_i \oplus \operatorname{MD5}(K \mathbin| N \mathbin| i) \ P_i &= C_i \oplus \operatorname{MD5}(K \mathbin| N \mathbin| i) \end{align*} $$ 我知道可以從散列函式設計流密碼,但我想具體了解 MD5 在這種特定情況下是否是可接受的散列函式。據我所知,碰撞攻擊與在流密碼中使用無關,但我想確保我沒有遺漏任何東西。這個方案是否適合我不幸的硬體/軟體限制?
我也知道作為業餘愛好者設計一個密碼方案是非常糟糕的。不幸的是,我別無選擇,因為我無法將自己的執行檔載入到設備上,幸運的是我不需要身份驗證或除靜態數據安全性之外的任何安全屬性(即,未經身份驗證的 AES-CTR 會夠了)。
只要你的編碼 $ K $ , $ N $ , 和 $ i $ 是單射的(即,對於您可以唯一導出的每個編碼字元串 $ K $ , $ N $ , 和 $ i $ ) 和固定長度,這幾乎可以肯定是一個不錯的流密碼。
顯然,它不會打破任何速度記錄!但碰撞阻力在這裡不相關,我沒有理由懷疑的分佈 $ x \mapsto \operatorname{MD5}(k \mathbin\Vert x) $ 對於固定長度 $ x $ 在統一的選擇下可以與統一區分 $ k $ . 任何區分者都可能會建議對 MD5 進行比通用部分原像攻擊更好的攻擊,儘管一些論文在荒謬的成本模型中聲稱相反,但到目前為止,還沒有證據表明對 MD5 進行原像攻擊。
也就是說:仔細考慮是否還需要進行身份驗證!未經身份驗證的加密在實際應用中很少有用。使用您擁有的工具,您也可以輕鬆計算 HMAC-MD5。Encrypt-then-MAC with MD5-CTR 和 HMAC-MD5 可能是愚蠢的,但它可能是一個相當安全的認證加密方案。
但是,請確保將自己限制在 $ {\lll}2^{64} $ 任何一個密鑰下的消息,因為 HMAC-MD5 的 128 位狀態承認生日偽造者,並確保使用至少 256 位密鑰以防多目標攻擊的危險。