Bitcoin-Core
為什麼比特幣核心中實現的 chacha20 使用 64 位隨機數?
chacha20的草案使用 64 位 nonce,但 chacha20 規範的最終版本使用 96 位 nonce。
#9792 PR將chacha20 添加到比特幣核心。我們可以看到該函式
ChaCha20::SetIV(uint64_t iv)
使用 64 位來設置 nonce 值。從這裡chacha20.cpp
提到它遵循 chacha20實現。比特幣使用 64 位隨機數有什麼特別的原因嗎?按照推薦使用 96 位隨機數不是更好嗎?
沒關係。舊版本有 64 位隨機數和 64 位計數器,而新版本用 96 位隨機數和 32 位計數器替換它。然而,出於我們的目的,它們都可以合理地被認為是一個不應該重複的 128 位數字。
Bitcoin Core 中的 ChaCha20 實現用作隨機數生成器的基礎,而不是(尚未)用作加密的流密碼,其中 nonce/IV 和塊計數器用於不同的目的。
在 RNG 中,256 位密鑰是隨機生成的(使用 OS 和系統隨機性),並且 nonce 和計數器都設置為 0。然後每生成 64 個字節,塊計數器就會遞增。如果我們改用 32 位計數器,我們需要處理計數器溢出的情況,最有可能的方法是在發生這種情況時增加隨機數。所有這一切仍然與將其視為 64 位隨機數和具有遞增非溢出計數器的計數器完全相同。