我的电子邮件使用 PGP 加密,我的朋友使用 S/MIME。我们都使用 thunderbird 写电子邮件。当他给我写一封签名的电子邮件时,我可以验证签名,同样,他也可以验证我的签名。但是,我们不能互相发送加密电子邮件。thuderbird 帮助页面说
您必须为所有收件人(包括您自己)提供相同技术的密钥或证书,因为 OpenPGP 和 S/MIME 是不同的加密技术,不能混合在一封电子邮件中。撰写加密电子邮件时,请确保选择了正确的技术。
但为什么这是必要的?如果我朋友的 Thunderbird 可以验证我的 PGP 签名,它应该能够使用我的 PGP 公钥加密发送给我的消息,无论他的密钥是否是 S/MIME,也无论他自己是否有任何类型的密钥。同样,我应该能够加密发送给他的消息,因为我可以验证他的签名。我是否忽略了什么?也许我没有 100% 地了解 S/MIME 与 PGP 公钥/私钥方法究竟有何不同...
答案1
发送加密电子邮件时,Thunderbird 希望能够为您自己存储一份加密邮件副本,并将其保存在“已发送”文件夹中。由于电子邮件对话的所有参与者(发件人和所有收件人)只创建一封合并邮件,因此 Thunderbird 必须为每个人提供相同技术的加密密钥。要求每个人都准备好使用相同的加密技术,可以避免解释限制并避免意外后果(例如“已发送”文件夹中的电子邮件丢失)。
答案2
但为什么这是必要的?如果我朋友的 Thunderbird 可以验证我的 PGP 签名,它应该能够使用我的 PGP 公钥加密发送给我的消息,无论他的密钥是 S/MIME
确实如此——只要他的钥匙完全不参与,这应该是完全可能的。但如果他还想用他的钥匙符号加密消息,这会发生冲突——两个系统都有自己的数据格式来打包签名/加密消息,通常你必须选择一种格式。
(理论上,Thunderbird 可以将 PGP 消息里面S/MIME 消息,但软件目前不支持该消息。
也许我没有 100% 了解 S/MIME 与 PGP 公钥/私钥方法究竟有何不同。
总的来说,虽然两个系统共享相同的私钥/公钥基本算法,但这只是组成它们的一小部分;这就像说“火车和飞机都有发动机”。
例如,从技术上讲,这两个系统都使用 RSA 和 EC,但实际上你永远不会直接处理普通的 RSA 或 EC 公钥——你总是处理证书,证书是一堆包裹在密钥周围的元数据,重点主要放在证书上,而不是下面的实际密钥。(首先,你的 PGP 证书总是有二证书内部可能有多个密钥对(可能更多),而 S/MIME 证书只有一个。元数据格式也不同;附加到元数据字段的语义不同;用于存储证书的文件格式不同。)因此,尽管将实际的 RSA 密钥从一个系统移植到另一个系统在技术上很简单,但通常几乎没有任何困难意义这样做的话,元数据就不会被保留下来,而这是最重要的部分。
另一个区别是数据格式。S/MIME 和 PGP 都有自己的方式将签名/加密的消息(或密钥/证书本身)打包成一系列字节,这些字节完全不兼容。如果您有一条 S/MIME 签名的消息,PGP 软件甚至无法开始处理它 - 密钥甚至不会进入问题,它甚至无法识别哪些字段放在哪里。(就像您可以将相同的数据存储为 XML 或 JSON,但期望 XML 的软件无法读取 JSON,即使它是“相同的数据”。)
现在,从技术上来说,可以使用 PGP 加密消息,将其存储为 PGP 格式,然后使用 S/MIME 对其进行签名,这样您就拥有了 PGP-inside-CMS;这两种格式都可以做到这一点。(或者,如果您愿意,也可以反过来。)但这带来了最后一个问题:它们由 Thunderbird 内部完全不同的代码片段处理,这些代码片段不会交互,因此即使 CMS 消息指示“我有一个 PGP 消息”,Thunderbird 的 S/MIME 代码也不知道如何处理它。它可以可以发挥作用,但目前我认为它不起作用。
(请记住,Thunderbird 具有 S/MIME 功能,实际上数十年在获得 PGP 支持之前——甚至在它被称为“Thunderbird”或“Mozilla”之前;它实际上可以追溯到 Netscape Communicator。相比之下,PGP 功能实际上是在去年左右添加的,在此之前它们只是作为名为 Enigmail 的 JS/XUL 扩展出现。)