TLS 中用於 AES-GCM 和 AES-CCM 的“顯式隨機數”的目的是什麼?
TLS 使用顯式(秘密)32 位隨機數與64 位序列號組合來創建AES-GCM的IV和AES-CCM的隨機數。但是,我想知道為什麼 TLS 需要顯式隨機數。
通常,序列號用於防止在 AES-GCM 中重複使用 IV,或在 AES-CCM 中重複使用 nonce。序列號不換行(RFC5246),因為如果序列號超過其限制,則必須重新協商密鑰。因此,不應發生在同一個鍵下使用兩次序列號的情況。
那麼為什麼要在序列號中添加一個額外的 32 位隨機數呢?
這個額外的 32 位隨機數充當鹽,並進行多重衝突攻擊 $ 2^{32} $ 倍難。
在這次攻擊中,攻擊者收集了大量的 TLS 會話,每個會話都有一個使用相同 nonce 加密的記錄。然後他選擇一個隨機密鑰,並為該密鑰(和固定的隨機數)生成計數器模式密鑰流;然後,他檢查該密鑰流是否允許他解密任何記錄(如果我們假設他知道每個記錄的明文,或者即使他知道許多對每一個都成立的線性方程)。如果他找到了這樣一個匹配的隨機密鑰,那麼他就擁有了該 TLS 會話的密鑰,並且可以對其進行完整解密。
如果攻擊者收集 $ 2^n $ 使用 AES-128 加密的會話,他需要檢查預期的 $ 2^{128-n} $ 能夠解密之前的隨機密鑰;對於任何合理的價值,這可能仍然不可行 $ n $ ,但仍然比我們想要的要容易。
通過隨機設置每個 nonce 的 32 位,這種攻擊變得更加困難。攻擊者不僅需要選擇隨機的 AES 密鑰,還需要隨機選擇 32 位的 nonce 設置,只有當所有這些位都正確時,他才能找到有效的解密;這使得攻擊需要一個預期的 $ 2^{160-x} $ 隨機鍵。另一種看待它的方式;這種多重碰撞攻擊沒有任何意義,除非攻擊者至少收集到 $ 2^{32} $ 單獨的會議;如果他擁有的更少,那麼攻擊者選擇一個會話會更有效率,並且只是暴力破解(32 位隨機數不會使對單個會話的暴力攻擊變得更加困難)。
此外,32 位隨機數是秘密的並不重要。如果 nonce 是公開的,同樣的邏輯也會起作用。但是,沒有理由不將其保密,而且在協議中更方便。