Nonce

如何為 ChaCha20 Poly1305 生成隨機數?

  • September 1, 2020

我正在使用帶有 Poly1305 的 ChaCha20 的自我實現。由於隨機數只有 96 位,因此不能隨機選擇。任何人都可以提出一種從密鑰生成隨機數的有效方法嗎?

RFC 7539描述了您的需求。

獨特性:

實施本文件最重要的安全考慮是 ChaCha20 中使用的 nonce 的唯一性。 計數器和 LFSR都是生成唯一隨機數的可接受方式,就像使用 DES 等 64 位密碼加密計數器一樣。請注意,使用 128 位或 256 位密碼加密的計數器截斷是不可接受的,因為這樣的截斷可能會在短時間內重複。(粗體是我的)

LFSR 和計數器非常有效。使用帶有原始多項式的 96 位二進制計數器或 96 位長度的 LFSR。在系統重新啟動期間必須小心,尤其是系統和電源故障,因為您必須將 nonce 儲存在某個地方才能正確恢復。您需要確保在發生故障時在計數器/LFSR 上進行長跳或生成新的新密鑰。

隨機生成:

您也可以在考慮生日限制的同時隨機生成它 $ \mathcal{O}(\sqrt n) $ . 您應該在生成之前停止 $ 2^{48} $ 同一鍵下的隨機數會發生碰撞。您可以通過生日計算來調整對手的優勢。

結合兩者

還可以將計數器/LFSR 與隨機生成相結合。例如,使用 48 位二進制計數器和 48 位隨機數。對於每一代隨機數,計數器/LFSR 遞增並生成一個新的 48 位隨機數。

這比單個計數器/LFSR 或基於隨機的計數器更可靠。在失敗期間,如果系統沒有正確寫入計數器/LFSR 的最後一步/階段,那麼隨機部分將有助於減輕先前隨機數的重複。

重複隨機數的後果

如果一個隨機數被重複,那麼一次性 Poly1305 密鑰和密鑰流在消息之間是相同的。**這揭示了明文的異或,**因為明文的異或等於密文的異或。

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