Encryption

我們可以加密部分 XChaCha/XSalsa 隨機數嗎?

  • November 7, 2020

此處詳述的 xChaCha 密碼擴展了 nonce 192 位,其工作原理如下(來自連結):

  1. 將密鑰和 24 字節 nonce 的前 16 個字節傳遞給 HChaCha20 以獲取子密鑰。
  2. 正常使用 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 位密鑰搜尋。

引用自:https://crypto.stackexchange.com/questions/85992