對 PGP 的選擇密文攻擊仍然可能嗎?
在2002 年的一篇論文(pdf) 中,Jallad 等人利用分組密碼在 PGP 下使用的 CFB 模式描述了對 PGP 的選擇密文攻擊。這是一次毀滅性的攻擊。
這種攻擊在 2016 年仍然可行還是 PGP 做出了改變?
RFC 4880、OpenPGP(已被 2002 年更新的 RFC 2440 取代)包含關於安全考慮的一章,其中還討論了 Jallad 等人描述的解密 oracle 攻擊:
2002 年夏末,Jallad、Katz 和 Schneier 發表了對 OpenPGP 協議及其一些實現的有趣攻擊
$$ JKS02 $$. 在這種攻擊中,攻擊者修改消息並將其發送給使用者,然後使用者將錯誤解密的消息返回給攻擊者。因此,攻擊者將使用者用作隨機預言機,並且通常可以解密消息。 壓縮數據可以改善這種攻擊。錯誤解密的數據幾乎總是以能夠擊敗攻擊的方式解壓縮。但是,這不是一個嚴格的修復程序,並且會留下一些小漏洞。例如,如果一個實現在加密之前沒有壓縮消息(可能是因為它知道它已經被壓縮),那麼該消息是易受攻擊的。由於這種偶然性——修改攻擊可以被解壓縮錯誤阻止——實現應該將解壓縮錯誤視為安全問題,而不僅僅是數據問題。
這種攻擊可以通過使用修改檢測來擊敗,前提是該實現不會讓使用者天真地將數據返回給攻擊者。實現必須將 MDC 故障視為安全問題,而不僅僅是數據問題。
在任何一種情況下,實現都可以允許使用者訪問錯誤的數據,但如果數據返回給發送者,必須警告使用者潛在的安全問題。
雖然這種攻擊有點模糊,需要一組特殊的環境來創建它,但它仍然非常嚴重,因為它允許某人欺騙使用者來解密消息。因此,重要的是:
- 實施者將 MDC 錯誤和解壓縮失敗視為安全問題。
- 實施者以應有的速度實施修改檢測並鼓勵其傳播。
- 使用者以應有的速度遷移到支持修改檢測的實現。
因此,引入了 OpenPGP 數據包“Sym. Encrypted Integrity Protected Data Packet (Tag 18)”和“Modification Detection Code Packet (Tag 19)”,共同形成了一個修改檢測系統(這是 Jallad 等提出的緩解措施)人):
非規範性解釋
創建 MDC 系統(稱為數據包 18 和 19)是為了提供一種完整性機制,該機制不如簽名強,但比裸 CFB 加密強。
CFB 加密的一個限制是,對密文的破壞會破壞受影響的密碼塊和後面的塊。此外,如果從 CFB 加密塊的末尾刪除數據,則無法檢測到該刪除。(另請注意,CBC 模式也有類似的限制,但從模組前面刪除的數據是不可檢測的。)
$$ … $$
至少 GnuPG 預設使用這些數據包,您可以通過
gpg --list-packets
或進行驗證pgpdump
:$ echo "foo" | gpg --recipient a4ff2279 --encrypt | pgpdump Old: Public-Key Encrypted Session Key Packet(tag 1)(524 bytes) New version(3) Key ID - 0xCC73B287A4388025 Pub alg - RSA Encrypt or Sign(pub 1) RSA m^e mod n(4093 bits) - ... -> m = sym alg(1 byte) + checksum(2 bytes) + PKCS-1 block type 02 New: Symmetrically Encrypted and MDC Packet(tag 18)(63 bytes) Ver 1 Encrypted data [sym alg is specified in pub-key encrypted session key] (plain text + MDC SHA1(20 bytes))
在 GnuPG 中,您可以通過選項強制使用新數據包
--force-mdc
(也可以在 中永久應用gpg.conf
)。來自man gpg
:通過修改檢測程式碼強制使用加密。這始終與較新的密碼(塊大小大於 64 位的密碼)一起使用,或者如果所有接收者密鑰都在其功能標誌中指示 MDC 支持。