Keys
為 Salsa20 重複 16 字節密鑰的目的
Salsa20 系列流密碼的核心是一個雜湊函式,它採用 64 字節塊,使用它來生成偽隨機 64 字節輸出。64 個字節包含空間
- 一個 32 字節的密鑰
- 一個 16 字節的常量
- 一個 8 字節計數器
- 一個 8 字節的隨機數
這些密碼旨在與 32 字節密鑰一起使用,但它們也可以與較小的密鑰一起使用。使用 16 字節密鑰涉及更改常量,因此不同大小之間沒有等效密鑰,並重複 16 字節密鑰以使其適合 32 字節(即輸入為 $ k \mathbin| k $ 對於 16 字節 $ k $ 並且只是 $ k $ 對於 32 字節 $ k $ ).
為什麼這樣做?為什麼密鑰不是簡單的零填充?如果在使用沒有均勻分佈的密鑰時可以更容易地對密鑰流進行密碼分析(但不是窮舉搜尋),那麼該方案就被破壞了。
來自The Salsa20 family of stream ciphers 的第 4.1 節:
每個塊、每個 nonce 和每個 32 字節密鑰的對角線常數都是相同的。作為一個額外的(非推薦的)選項,Salsa20 可以使用一個 16 字節的密鑰,重複形成一個 32 字節的密鑰;在這種情況下,對角線常數變為 0x61707865、0x3120646e、0x79622d36、0x6b206574。
如果我們將密鑰的後半部分修復為全零,我們至少有兩個潛在問題:
- 零位不提供額外的擴散效應,而重複密鑰會增加擴散效應。
- 通常對手會知道 $ 1/2 $ 輸入和控制 $ 1/4 $ ,但與 $ 16 $ 更多靜態已知字節,對手現在知道 $ 3/4 $ 的輸入。這可能使對手有足夠的控制權來發動更多可能尚未分析的攻擊;雖然可能只有減少圓形chacha。
如果不進行昂貴的分析,我只能推測靜態零字節只會削弱 chacha。我不知道有多少,但我確實懷疑它是否足以打破完整的 20 輪茶茶。