這種由 MD5 建構的加密算法是否安全?
我被要求在我的程式碼中使用加密算法,除了我確信會有導致漏洞的實現錯誤之外,我還擔心算法本身。我想知道我需要多麼強烈地說服這些人不要使用它。如果它是一種可接受的算法並且有一個名稱,我想知道這樣我就可以在某個地方找到它的實現(我已經接受過不實現我自己的加密的培訓)。
我不是密碼學家,這來自一家大公司和比我有更多程式經驗的人,所以如果我確實需要說服人們不要使用它,那將很困難。
- 該算法從一個與 MD5 摘要長度的隨機字元串連接的秘密開始。
- 它對這個初始字元串進行 MD5 消化,並將該摘要與輸入數據進行異或(直到 MD5 摘要的長度)。
- 它獲取 XOR 操作的結果,將其保存到輸出緩衝區,並將其與原始密鑰連接起來以得到新的摘要。
- 然後它繼續執行,直到它覆蓋了整個輸入。
該方案的目標是允許知道秘密的各方閱讀消息,並且不允許不知道秘密的各方閱讀這些消息。
現在我理解了符號,我可以更清楚地說明這一點:
$ C_1 = M_1 \oplus \operatorname{MD5}( secret || random ) $
$ C_n = M_n \oplus \operatorname{MD5}( secret || C_{n-1} ) $
我也不明白這是如何解密的。似乎需要相同的隨機字元串,在這種情況下,我們遇到瞭如何將隨機字元串發送給其他方的問題——該部分可以明文發送嗎?
該算法(現在相當清楚)讓人想起CFB 模式下的分組密碼,其中 $ random $ 作為 IV(可以是公開的), $ secret $ 作為密鑰,MD5 用作密鑰流生成器而不是分組密碼。
解密的工作方式與 CFB 中的一樣:
$$ \begin{align*} M_1 &= C_1 \oplus \operatorname{MD5}( secret\mathbin|random )\ M_n &= C_n \oplus \operatorname{MD5}( secret\mathbin|C_{n-1} ) \end{align*} $$ 如果MD5 在Random Oracle Model中是安全的,那將與 CFB 模式中的 128 位分組密碼一樣安全。雖然 MD5在 ROM中不安全,但我沒有看到在非互動式攻擊中損害消息機密性的攻擊,假設 $ secret $ 是不可猜測的並且 $ random $ 不重複使用。特別是,我沒有看到MD5 碰撞的可行性,或者 MD5 的長度擴展屬性,直接啟用攻擊。
主要問題是:
- 這是不安全的,如果 $ secret $ 很短或/並且容易被列舉,因為沒有使用鍵拉伸。
- 如果攻擊者可以根據同一消息中較早的密文塊在被加密的消息中註入某些內容,則這是不安全的。
- 如果解密方揭示了沒有意義的解密消息,這是不安全的,並且攻擊者可以修改密文。
- 沒有嘗試保護消息的完整性。
- 沒有給出測試向量。
- 與分組密碼相比,這是低效的(但在 MD5 是唯一有效實現的密碼原語的情況下,它可能仍然優於以解釋語言編碼的分組密碼)。
- MD5 的名字被玷污了,它有已知的弱點,而且攻擊只會變得更好。
- 整個事情不是一個既定的算法,目前的答案中沒有任何內容構成任何形式的認可,恰恰相反。