哪一種分組密碼模式是最好的?
我有兩個關於分組密碼模式的問題:
- 哪一種模式被認為是最好的?
我知道 CBC 存在 IV 問題,因為明文的下一個塊與最後一個塊的密文結果進行異或運算,與 OFB 相同。點擊率是最好的還是不是? 2. 在“在 CBC 模式下使用塊密碼的 SSL”中,TLS 1.2 是否使用 CBC,或者是否有任何其他模式與 TLS 1.2 (SSL 3.0) 一起使用?
我個人喜歡支持完整性檢查和身份驗證的模式,例如 GCM,因為它們只需要一個密鑰,並且不易受到密文更改的影響。一個特別重要的問題領域是填充預言攻擊,這比人們似乎承認的要普遍得多。
請注意,GCM/AES 就像 CTR 一樣是流密碼模式下的分組密碼;基本上 GCM 由 GMAC 和 CTR 組合組成。
XML 加密 v1.1 支持 GCM(XML 加密本身很容易受到填充預言機攻擊)。還有https://www.rfc-editor.org/rfc/rfc5288描述了在 TLS 中的使用和https://www.rfc-editor.org/rfc/rfc5084描述了在 CMS 中的使用。
GCM 似乎有一些支持,例如Java 8 在標準Java Runtime 中引入了GCM。對於 Java 7 及更低版本,需要使用外部提供程序,例如 Bouncy Castle。
沒有“最佳”操作模式,只有在不同情況下或多或少有用的模式。
CBC 模式需要一個對手無法預測的初始化向量(最好是隨機的),特別是如果該對手可以發動選定的明文攻擊。直到 TLS 1.0(即也在 SSL 2.0 和 3.0 中),CBC 與“使用上一條消息的最後一個塊作為 IV”一起使用,如果消息之間有一段時間,這顯然是不可預測的。TLS 1.1 通過使用隨機的每消息 IV 解決了這個問題。
這個問題可以通過在任何真實消息之前(即在應用程序決定真實消息的內容之後)直接發送一個空消息(仍然被填充到至少一個完整塊)的實現(不違反協議)來避免,並且這就是 OpenSSL 在相當長一段時間內所做的事情。(它只對發送方有幫助,但對接收方沒有幫助。)
CTR 模式要求初始化向量對於相同密鑰的所有使用都是不重複的,因為相同的 IV 會給出相同的密鑰流(然後與消息進行異或)——這對 OFB 模式有效。