在 ChaCha20 中使用隨機數代替計數器是否安全?
除了 IV,ChaCha20 還接受一個隨機數和一個計數器作為輸入。
我找不到有關此的更準確資訊,但似乎計數器只是 PRNG 損壞時的一種安全措施。
如果使用者的 PRNG 很好,那麼在 ChaCha20 中使用另一個隨機數代替計數器是否安全?
在某些應用程序中,例如具有泛洪協議的 P2P 網路,這可能很有用,因此我不必將所有這些計數器保存在記憶體中。
我在這裡使用RFC 7539中的描述和術語。
ChaCha20 用於處理消息,每條消息都是一個字節序列;ChaCha20 生成每個 64 字節的偽隨機塊,這些塊與要加密或解密的數據進行異或。關鍵的安全屬性是,對給定密鑰的**所有ChaCha20 塊函式呼叫都使用不同的值來表示狀態字 12 到 15 中註入的內容。
在 RFC 7539 的描述中,狀態字 12 接收一個超過 32 位的計數器值,並為每個塊遞增,而狀態字 13 到 15 接收一個 96 位“nonce”,它對於給定消息是固定的,但不同對於每條消息。這個想法是,對於給定的密鑰:
- 每條消息都使用一個新的 nonce 值(96 位),因此沒有兩條消息共享相同的 nonce。
- 在一條消息中,不同的塊使用相同的 nonce 但不同的計數器值。
- 沒有消息可以包含超過 $ 2^{32} $ 塊(即接近 275 GB,“應該足夠了”)。
Nonce 值本身可以以任何方式生成,只要以足夠的機率提供唯一性保證。如果你隨機生成 nonce 值(使用統一的生成器),那麼只要不產生太多消息,重用的風險就會很低;和 $ n $ 消息,重用機率約為 $ n^2/2^{96} $ . 換句話說,如果你不發送超過 80 億條隨機 96 位 nonce 和相同密鑰的消息,那麼重複使用相同 nonce 的風險不到十億分之一。
請注意,以上所有內容都是為了重用具有相同 key的 nonce 值。如果兩條消息使用相同的隨機數+計數器但使用不同的密鑰,則不存在安全問題。
在 P2P 網路中,從概念上講,消息使用從某種密鑰交換(例如 ECDH)派生的密鑰進行加密,每個節點必須記住為其每個鄰居使用的密鑰;記住計數器值和每個這樣的鍵應該不會太麻煩,特別是如果這些鍵是臨時的,即僅在 RAM 中。