Protocol-Design
Skein 或 Keccak 流密碼構造
我想知道在這種結構中使用 Skein 或 Keccak 雜湊算法(作為流密碼)是否安全:
- $ H $ = 具有 256 位輸出的 Keccak 或 Skein 雜湊
- $ K $ = 主 256 位隨機密鑰,在發送方和接收方之間預先共享
- $ K_M $ = 用於創建 MAC 的輔助 256 位隨機密鑰,在發送方和接收方之間預先共享
- $ IV $ = 每個消息的 256 位隨機初始化向量,以明文形式發送,帶有密文和 MAC
- $ i $ = 每條消息的計數器從 0 開始,每 256 位塊遞增 1
- $ K_i $ = 生成密鑰的 256 位塊,用於加密相應的 256 位塊的明文 $ P_i $
- $ P_i $ = 明文的 256 位塊。最終的明文塊將用 0 位填充到右側,因此最終連接的明文是 256 位的倍數,並偽裝了真正的明文長度。
- $ C_i $ = 256 位密文塊
- $ | $ = 串聯
- ⊕ = 異或
加密:
- $ K_i $ = $ H $ ( $ K $ | $ IV $ | $ i $ )
- $ C_i $ = $ K_i $ ⊕ $ P_i $
蘋果電腦:
- $ H $ ( $ K_M $ | $ IV $ | $ C_i $ … $ C_n $ )
我希望我解釋清楚了。
我的另一個問題:
使用相同的密鑰進行加密和 MAC 是否存在特殊攻擊?
我想知道在這種結構中使用 Skein 或 Keccak 雜湊算法(作為流密碼)是否安全:
在 Skein 和 Keccak 的情況下,它應該是安全的。但是,這兩個都定義了自己的密碼模式,您應該更喜歡 IMO。(為了速度和兼容性,如果不是安全的話。)
- Skein one 在論文的第 4.10 節中定義。它直接使用底層原語,而不是散列鍵和隨機數。
- 對於 Keccak,該網站連結到有關經過身份驗證的加密模式的單獨論文。它使用海綿來壓縮更多的輸出位,就像散列函式的 SHAKE 模式一樣。
或者,在 Keccak/SHA-3 的情況下,您可能想要使用 SHAKE 可擴展輸出函式之一,它會產生任意長的輸出流。它們也可能比重複呼叫散列函式更快。
使用相同的密鑰進行加密和 MAC 是否存在特殊攻擊?
您應該確保 MAC 呼叫永遠不會匹配加密呼叫。即不可能 $ K|IV|C $ 匹配任何 $ K|IV|i $ . 最簡單的可能是添加一個字元串以使它們不同,例如 $ H(K|\text{‘E’}|IV|i) $ 和 $ H(K|\text{‘A’}|IV|C) $ .
在這種情況下,MAC 和加密是獨立的,已知或選擇的明文攻擊不能洩漏任何額外的 MAC 值。
通常,您的構造不一定是安全的。首先,當您添加密鑰時,散列函式不一定是安全 MAC。其次,流密碼必須是 PRF,這對於 MAC 來說是比不可偽造性更強的條件。
例如,您可以定義一個愚蠢的 MAC,如: $ MAC_k(m)||MAC_k(m) $ 它與原始 MAC 一樣強大,但會產生糟糕的流密碼。
(實際上,大多數 MAC 似乎也聲稱是 PRF。)