我們可以加密部分 XChaCha/XSalsa 隨機數嗎?
此處詳述的 xChaCha 密碼擴展了 nonce 192 位,其工作原理如下(來自連結):
- 將密鑰和 24 字節 nonce 的前 16 個字節傳遞給 HChaCha20 以獲取子密鑰。
- 正常使用 ChaCha20 的子密鑰和剩餘的 8 字節隨機數(以 4 NUL 字節為前綴,因為$$ RFC8439 $$指定一個 12 字節的隨機數)。
我的問題是我們可以通過使用 16 個字節的隨機數和密鑰執行額外的初始輪 (HChaCha20) 來加密隨機數的第二部分嗎?
我們可以通過增加隨機數的兩個部分之一作為計數器,因為它們佔用了通常的計數器槽。我想同樣的問題也適用於 XSalsa20。
我認為這會在某處妥協。這似乎是一種使蠻力變得更加困難的非常簡單且便宜的方法。額外的回合大約需要 10 毫秒。
編輯 - 希望下面的內容使這個想法(有點)更清晰。我貧乏的程式碼是在 javascript 中。
注意:HChaCha20 的初始化方式與 ChaCha 密碼相同,只是 HChaCha20 使用 128 位隨機數並且沒有計數器。 相反,塊計數器被隨機數的前 32 位替換。
//Encrypt subkey = hchacha20(key, nonce[0:15]); nonce[0]+=1; //or any part which occupies the usual counter block, nonce[0-4]? subkey2 = hchacha20(key, nonce[0:15]); nonce[0]-=1; //or..etc subnonce = subkey2 ^ nonce[16:23]; chacha20_nonce = "\x00\x00\x00\x00" + nonce[16:23]; //Run ChaCha20 output = ciphertext + nonce[0:15] + subnonce); //Decrypt subkey = hchacha20(key, nonce[0:15]); nonce[0]+=1; //or any part which occupies the usual counter block, nonce[0-4]? subkey2 = hchacha20(key, nonce[0:15]); subnonce = subkey2 ^ nonce[16:23]; chacha20_nonce = "\x00\x00\x00\x00" + subnonce; //Run ChaCha20 output = plaintext;
首先是 XChaCha20-Poly1305 基礎知識
- 為什麼一個人可能需要 XChaCha20
ChaCha20是ChaCha家族的20輪。伯恩斯坦版的 ChaChax 有一個 64 位隨機數和 64 位計數器。Bernstein 在XSalsa 論文中認為這應該足夠了
有一個標準的論點是 64 位隨機數足夠長。Nonce 安全並不意味著不可預測性;它意味著唯一性。應用程序可以生成一個隨機數作為單調時間戳或只是一個計數器 1,2,3,…
對於長壽命的密鑰,ChaCa20 的 64 位隨機數太短而無法安全使用,因為在 2^32 消息周圍的生日攻擊中,一個人將有 50% 的機率命中相同的隨機隨機數,這至少會導致失去保密性。
XChaCha20 基於使用 96 位隨機數的 IETF 版本。
- ChaCha20-Poly1305 隨機數的安全性
ietf 的文件說,在 $ 2^{96} $ 消息應該期望與生日攻擊發生衝突。50% 對攻擊者非常有利,而更保守的最多生成 $ 2^{80} $ nonce 使得碰撞機率為 $ \frac{1}{2^{32}} $ . 而且,這個 $ 2^{80} $ 一鍵下的消息應該足夠了。因此,XChaCha20 可以安全地與隨機數一起使用。安全性降低到 ChaCha20-Poly1305 的安全性
ChaCha20-Poly1305 的工作原理
- 統一隨機隨機數的 128 位密鑰和前 128 位(16 字節)用 HChaCha20 處理
- HChaCha20 返回兩個 128 位。
- nonce 的剩餘 64 位(8 字節)附加了 4 個空字節。
xchacha20_encrypt(key, nonce, plaintext, blk_ctr = 0): subkey = hchacha20(key, nonce[0:15]) chacha20_nonce = "\x00\x00\x00\x00" + nonce[16:23] return chacha20_encrypt(subkey, chacha20_nonce, plaintext, blk_ctr)
返回問題
我的問題是我們可以通過使用 16 個字節的隨機數和密鑰執行額外的初始輪 (HChaCha20) 來加密隨機數的第二部分嗎?
我正在讀這個
xchacha20_encrypt(key, nonce, plaintext, blk_ctr = 0): subkey = hchacha20(key, nonce[0:15]) subNonce = hchacha20(key + nonce[0:15], nonce[16:23]) chacha20_nonce = “\x00\x00\x00\x00” + subNonce return chacha20_encrypt(subkey, chacha20_nonce, plaintext, blk_ctr)
解密對方必須遵循相同的步驟,因為它們是不可逆的!因此,您需要發送隨機數
$$ 16:23 $$照原樣。 因此沒有必要這樣做,因為我們期望隨機數是隨機生成的。如果你真的想這樣做,你可以,你不會在蠻力方面獲得任何優勢。攻擊者仍然需要搜尋超過 128 位。結果,這根本沒有增加安全性。
我認為這會在某處妥協。這似乎是一種使蠻力變得更加困難的非常簡單且便宜的方法。額外的回合大約需要 10 毫秒。
它根本不會損害任何東西,但也不會提供任何 XChaCha20-Poly1305 的安全性。如上所述,蠻力攻擊仍然需要 128 位密鑰搜尋。