Protocol-Design

生成非重複的 N 位 IV,與隨機性無法區分

  • October 10, 2011

我正在實現一個協議,每個加密數據包都需要一個 64 位 IV。使用中的密碼(AES-GCM,或多或少在RFC 4106中指定)不要求這些 IV 是隨機的,只要求它們不會針對任何給定的密鑰重複。然而,該協議強加了額外的要求,即線路上的每個字節在統計上與隨機性沒有區別。

因此,我需要的是一個產生連續 64 位數字的 PRNG,並保證在所有 2 64種可能性都用盡之前不會重複。我不認為這個 PRNG 必須是加密安全的,但我想它不會受到傷害。我會在從真正隨機源生成 AES 密鑰(這是一個短期會話密鑰)的同時播種這個 PRNG。

我應該使用什麼 PRNG 算法?

我想生成這些初始化向量的最簡單方法是使用 64 位分組密碼(如 Blowfish 或 DES/3DES),並加密 64 位計數器的順序值。

當然,好的分組密碼的“與真正的隨機性無法區分”屬性只有在攻擊者不能觀察到的情況下才有效 $ 2^{32} $ 這樣的初始化向量,然後一個真正的隨機序列將開始顯示重複的元素,而您的則不會,根據您的要求。

實際上,如果唯一的要求是隨機數,並且您的協議消息按發送順序到達(例如通過 TCP 連接),則您不必將其與實際的流數據一起發送,只要對方有必要的資訊生成它。然後一個簡單的計數器,在兩邊都計數(並且從不傳輸),會做得很好(你不必考慮另一個需要管理的密鑰)。

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