Initialization-Vector

在 TLS 1.2 中生成 IV

  • January 7, 2021

我正在使用自定義協議編寫 TLS 1.2 實現(在 C# 中)。

我的問題是如何生成附加到每條消息的 IV,我不想使用RandonNumberGenerator,因為我聽說它很慢。相反,我想使用一些 PRNG。我只會支持 AES-128/-256。

通過閱讀,我了解到使用隨機 IV 並加密一個計數器(應該從一個隨機數開始)並使用它,因為 IV 是可以的。真的嗎?使用多少次後,我應該使用新的隨機 IV?我可以使用相同的密鑰來生成 IV 和加密消息嗎?

使用 .Net 的Random類和來自RNGCryptoServiceProvider的種子可以完成這項工作嗎?我應該使用多少次後使用新種子?

要回答您的具體問題:

從閱讀中我了解到……加密計數器並使用它作為 IV 是可以的,這是真的嗎?

對於 CBC 模式,這是絕對正確的,只要您用來加密計數器的密鑰是秘密的(也就是說,任何可能的對手都不知道)。

我應該從隨機數開始嗎?

實際上,這是一個品味問題。如果你願意,你可以從 0 開始。

如果您使用已知計數器,攻擊者將學習(例如)的加密

$$ 0 $$,$$ 1 $$,$$ 2 $$等等。這對於 CBC 模式來說不是什麼大問題;每當您加密已知的明文時,攻擊者都會獲得更多已知的明文/密文對。僅當將來 CBC 模式碰巧使用完全相同的明文(生成完全相同的密文)時,這才有助於攻擊者,使用 AES,您有 $ 2^{128} $ 可能的明文/密文對;意外重用一個是不可能的(因此添加更多,因為您加密了一些已知的計數器不會有害。 現在,如果方便地從一個隨機數開始,那麼,這並沒有什麼壞處。但是,除非它很容易,否則我不會這樣做。

使用多少次後,我應該使用新的隨機 IV?

沒有要求重新播種您的計數器。如果您加密的次數超過 $ 2^{64} $ 消息左右;但是,在這種情況下,CBC 模式已經遇到問題(無論如何,您將無法在合理的時間內加密那麼多消息)。

我可以使用相同的密鑰來生成 IV 和加密消息嗎?

如果您使用相同的密鑰,您不僅可以,而且您的情況會更好。還記得我在哪裡說過你加密計數器的密鑰應該是“任何可能的對手都不知道”嗎?好吧,我們已經有了這樣的鑰匙;用於加密消息的密鑰。畢竟,如果對手確實擁有那個密鑰,他就已經可以閱讀消息了;任何源於 IV 可預測的弱點都是無關緊要的。因此,通過使用相同的密鑰來執行這兩項操作,我們減少了需要對對手保密的秘密數量。

一個小警告:如果您以這種方式重複使用密鑰,則不應允許攻擊者選擇或控制計數器。按照您的建議,可以使用從 0 開始的計數器或具有隨機起點的計數器(使用 RandomNumberGenerator 生成起點)。

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