使用雜湊和迭代鹽進行異或加密有什麼問題
假設您將使用以下算法來加密消息
- 讓 $ k $ 成為加密的關鍵
- 讓 $ m $ 成為要加密的消息
- 分裂 $ m $ 分成 512 個字節的組
給定一個具有 512 位輸出的雜湊函式。
對於消息中的每個 512 位組:
讓 $ s $ 從 0 開始
- 讓 $ l = hash(k + s) $
- 將目前消息組與 $ l $
- 將上面的結果附加到最終結果中。
- 增加 $ s $ 由 1。
- 重複直到消息中沒有更多組
如何破解這樣的加密?如果雜湊函式設計得很好,那麼輸入中的每一位應該有 50% 的機會在輸出中被翻轉。
輸入和輸出之間唯一可預測的關係應該是消息的長度。在這種情況下,輸入和輸出的長度總是相同的。但這是一個安全問題嗎?如果是這樣,人們將如何利用它?
編輯:這個問題被標記為可能重複。與連結的問題相反,這個問題與所使用的雜湊函式的細節無關。這個問題假設 $ hash(m) \rightarrow m’ $ 功能是完美的,並且假設它是一種安全的加密方法。
假如說:
- 功能 $ F_k(s) = {\rm hash}(k + s) $ 形成一個由鍵索引的偽隨機函式族(PRF) $ k $ , 和
- 每個密鑰僅用於加密一條消息,
那麼這個結構可以證明是1安全的,可以抵禦選擇明文攻擊。
作為 PRF不是密碼散列函式的標準屬性,因此不能僅僅假設任何給定的安全散列函式都會滿足它。當以這種方式使用時, “完美雜湊”(即隨機預言機)確實會產生 PRF,但某些現實世界的雜湊函式可能具有以這種方式使用它們可能暴露的弱點。
然而,幸運的是,有一種將散列函式轉換為 PRF 的標準方法,稱為HMAC。2 因此,您可以使用 $ {\rm HMAC}_{\rm hash}(k; s) $ 代替 $ {\rm hash}(k + s) $ . 或者只是使用一個在以這種方式使用時聲稱是 PRF 的雜湊函式。3
至於加密多條消息,問題在於,正如 cygnusv 所指出的,對使用相同密鑰加密的兩個密文進行異或運算會抵消散列輸出,從而產生相應明文的異或。如果攻擊者知道其中一個明文,他們就可以輕鬆地恢復另一個。
通過選擇唯一的nonce字元串可以輕鬆解決此限制 $ n $ 對於每條消息並將其包含在雜湊輸入中,例如 $ {\rm hash}(k + n + s) $ 或者 $ {\rm HMAC}_{\rm hash}(k; n + s) $ . 當然,nonce 必須與密文一起儲存/傳輸,以便可以解密。
(另外,為了避免由於連接的模糊性而導致的攻擊,至少兩個 $ k $ , $ n $ 和 $ s $ 應該有一個固定的長度;否則,例如 $ k = \text{“xyz”} $ , $ n = \text{“123”} $ , $ s = \text{“4”} $ 產生相同的雜湊輸入 $ k = \text{“xyz”} $ , $ n = \text{“12”} $ , $ s = \text{“34”} $ 或者 $ k = \text{“xyz1”} $ , $ n = \text{“23”} $ , $ s = \text{“4”} $ . 或者你可以簡單地用一些不那麼模棱兩可的編碼替換串聯。)
1)證明與證明CTR模式加密的IND-CPA安全性的證明基本相同,只是我們不需要PRP/PRF切換引理,因為我們已經有一個PRF,並且要求只有一個消息可以加密顯然需要對 IND-CPA 遊戲進行一些修改以使其不平凡。一個自然的選擇是允許攻擊者線上訪問加密預言機,即送出單個明文塊的能力,預言機將加密作為單個消息流的連續部分並立即返回給攻擊者。
嚴格來說,HMAC 的標準安全證明僅適用於某些類型的雜湊函式,稱為 Merkle-Damgård 雜湊,並且僅適用於對其內部操作的某些特定假設。也就是說,大多數傳統散列(包括 SHA-1 和 SHA-2)屬於 Merkle-Damgård 類型,並且大多數新散列(如SHA-3)在 HMAC 中使用時都明確聲稱是安全的,即使它們不使用Merkle-Damgård 結構。
在我的腦海中,我相信 SHA-3 / Keccak 通過其“扁平海綿聲明”有效地提出了這一聲明;當然,如果您仍然在使用 Keccak,那麼使用其標準化為 SHAKE128/256 的可變長度輸出來生成足夠的位以從單個雜湊輸入加密整個消息會更容易。