Protocol-Design
TLS 1.1 和 1.2 如何為每條記錄生成 IV(初始化向量)?
根據RFC 4346
顯式 IV
$$ CBCATT $$描述了對 TLS 的選擇明文攻擊,該攻擊依賴於知道記錄的 IV。以前版本的 TLS$$ TLS1.0 $$使用先前記錄的 CBC 殘差作為 IV,因此啟用了此攻擊。此版本使用顯式 IV來防止這種攻擊。
IV在具體實現中是如何生成的?(如 openSSL、BouncyCastle)
實現應該從任何加密安全的 PRNG 生成 IV 。TLS 1.1進一步詳細說明了執行此操作的可能方法:
- IV 可以從 PRNG 獲得。
- 一個隨機字元串 $ r $ 可以從 PRNG 生成,並添加到明文中以加密 IV 應該去的地方;然後整個批次都使用固定的 IV 加密,甚至使用前一條記錄的最後一個塊作為 IV 加密。這種方法更容易映射到 CBC 加密的現有實現上,因為 IV 被視為明文。它是安全的,因為 $ E(r \oplus iv) $ , 對於給定的 $ iv $ (例如上一條記錄的最後一個塊)和加密功能 $ E $ , 是均勻隨機的 $ r $ 本身。
- 相同的方法,但使用 $ r $ 是一個固定的字元串。
目前尚不清楚第三種方法是否安全。它依賴於加密 $ E $ “充當 PRNG”。TLS 1.1 規範包括:
The following alternative procedure MAY be used; however, it has
not been demonstrated to be as cryptographically strong as the above procedures. The sender prepends a fixed block F to the plaintext (or, alternatively, a block generated with a weak PRNG). He then encrypts as in (2), above, using the CBC residue from the previous block as the mask for the prepended block. Note that in this case the mask for the first record transmitted by the application (the Finished) MUST be generated using a cryptographically strong PRNG.
由於規範將其指定為“MAY”,因此必須假設某些實施者可能已經使用了這第三種方法。它的優點是不需要對每條記錄都呼叫一次 PRNG,只需要對第一條記錄進行一次 PRNG 呼叫,因此可以容忍相對較慢的 PRNG。
有趣的是,所有這些詳細的段落都已從TLS 1.2中刪除,它僅聲明了通用的“初始化向量 (IV) 應該隨機選擇,並且必須是不可預測的”。