Implementation

使用 dev/urandom 為 nonce 實現 GCM

  • March 1, 2017

我目前正在嘗試將 GCM 集成到我的程式碼中,並且我有足夠的知識知道我可能做錯了。我知道對於 GCM 和其他 CTR(如密碼),多次使用相同的密鑰和相同的 nonce 是一個可怕的、可怕的、非常糟糕的主意。問題是,在相當長的一段時間內(數百或數千條消息)使用相同的密鑰,如果隨機數使用 /dev/urandom 隨機化每條消息,那麼重複隨機數的可能性是多少。還是我應該簡單地堅持以隨機數開頭的計數器?

澄清:每個會話的密鑰都是唯一的,來自 diffie hellman 組 14。我唯一擔心的是可能會生成兩個匹配的隨機數,假設池中有來自 dev urandom 的 20000 個隨機數

如果您遵循NIST 的建議並使用 96 位 NONCE(12 字節),那麼使用 /dev/urandom 生成的隨機 NONCE 應該沒問題。它應該為您的需要提供足夠的熵。

但是最好使用 NONCE 的確定性構造。它要求 NONCE 由一個 32 位“固定欄位”和一個 64 位計數器組成。您可以為您的固定欄位使用序列號,也可以按照標準規範的建議使用隨機生成的字元串。因此,您最多可以使用相同的鍵/NONCE執行 2 64次操作。但是,您對可以處理的操作數量有一個硬性限制,從底層 CTR 操作模式到 2 32 - 2。

您決定中的另一個數據點可能是Nonce-Disrespecting Adversaries: Practical Forgery Attacks on GCM in TLS 中的建議:

我們得出結論,不太可能使用隨機隨機數對實現進行攻擊,但不能明確排除。出於安全原因,應避免隨機數,並應使用計數器。

我在一篇博文中總結了一些關於如何正確使用 AES-GCM 的更多注意事項。

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