為什麼不經常使用 CTR 模式(計數器模式)?
對於CTR模式,設計有利於並行化,是的,從crypto++下載的程序的基準測試似乎證明了在Intel I7 CPU上。
我的問題是,由於當今電腦上的大多數 CPU 都是多核的,並且專為多執行緒計算而設計,為什麼不是所有人都使用 CTR 模式,因為它比 CFB 模式快得多(在 Intel I7-4770K 上大約快 4 倍,3.5 GHz CPU)?
這可能有很多很好的理由,儘管我不希望可以組成一個科學的答案(因為你需要使用調查,而且我從未聽說過這樣的操作模式)。
讓我列出幾個可能的原因:
- 開發者不了解 CTR 操作模式;StackOverflow 上的大多數問題都是關於 ECB 和 CBC 的(我真的希望 SO 不會在所有地方都反映企業慣例);
- 即使在今天,某些執行時也可能無法使用 CTR 模式(在大多數較低級別的庫上實際上只能保證 ECB 和 CBC 模式);
- (較舊的)協議可以簡單地指定其他操作模式。
關於提供的並行性:
- AES 已經非常快了,如果晶片中存在 AES 指令(例如 Intel/AMD CPU 中的 AES-NI),那麼通常不需要 CTR 模式提供的並行性;
- 許多需要快速加密的問題本身可以令人尷尬地並行化(例如,多個文件加密和與伺服器的 TLS 會話);
- 多執行緒很難正確處理,並且可能很難使用(例如,您可能不希望所有核心都只是加密數據);
你用 CPU 的術語來思考。然而,很多人不使用 C/C++,而是使用更高級的語言。這些可能具有完全不同的操作級別,並且可能對操作模式沒有很好的支持,更不用說對這些操作模式的多執行緒支持了。
如果您想創建一個在許多設備上受支持的協議,您可能需要將 CBC 標準化為最高公分母。C/C++ 可能很快,但以這些語言創建的軟體也出了名的難以保護,使您面臨各種攻擊。速度不錯,但如果由於緩衝區溢出而失去數據,它就沒有用了。
在加密社區中,CTR 可能是城裡最熱門的模式。例如,它在 GCM、CCM 和 EAX(經過身份驗證的操作模式)中用作提供機密性的底層模式。它有一個不好的特殊加密屬性:nonce (IV) 重用對於使用 CTR 發送的消息的機密性是災難性的。CBC 模式下的 IV 更難正確,但如果您不這樣做,它的失敗也不會那麼嚴重。
最後,通常根本不需要 CTR 模式。但隨著使用它進行加密/消息保密的 AEAD 模式的進步,它可能會悄悄捲土重來;許多開發人員會在不知道它存在的情況下使用它。
我自己的兩分錢是它始於心理偏見,因為與 CBC 中的遞歸 AES 加密相比,CTR 模式下的 AES 加密連續數字是一個弱點。實際上,我想我記得在 Coursera 上的那門課程中很少有人說,在一開始就沒有就可能的攻擊角度方面的反擊達成共識。
在那些第一次選擇並且對密碼學概念仍然新鮮的人中,這種偏見可能仍然揮之不去。但即使沒有它,我想 CTR 模式的採用也為時已晚。