Enigmail 如何获取向您发送加密电子邮件的人的公钥?您必须自己导入它还是从密钥服务器获取密钥?
答案1
密钥(通常)写入邮件头中。但这封(加密)邮件不包含任何如果没有签名,则不会包含发送者的信息。让我们分析一下 OpenPGP 消息中包含的内容。
分解加密的 OpenPGP 消息
如果你列出加密消息中包含的数据包,你就会看到这一点:
$ echo foo | gpg --encrypt --recipient 0xa4ff2279 | gpg --list-packets
输出以“公开”可见的未加密标头开始,其中包含加密消息的子密钥:
:pubkey enc packet: version 3, algo 1, keyid CC73B287A4388025
data: [4092 bits]
输入密码后,GnuPG 还会打印剩余的数据包:
:encrypted data packet:
length: 63
mdc_method: 2
gpg: encrypted with 4096-bit RSA key, ID A4388025, created 2014-03-26
"Jens Erat (born 1988-01-19 in Stuttgart, Germany)"
:compressed packet: algo=2
:literal data packet:
mode b (62), created 1402861918, name="",
raw data: 4 bytes
分解已签名的 OpenPGP 消息
A签消息包含发送者的签名(子)密钥ID,参见:signature packet
行(第四个数据包)。
$ echo foo | gpg --sign | gpg --list-packets
(GnuPG 要求输入密码,用于签名)
:compressed packet: algo=1
:onepass_sig packet: keyid 8E78E44DFB1B55E9
version 3, sigclass 0x00, digest 2, pubkey 1, last=1
:literal data packet:
mode b (62), created 1402862406, name="",
raw data: 4 bytes
:signature packet: algo 1, keyid 8E78E44DFB1B55E9
version 4, created 1402862406, md5len 0, sigclass 0x00
digest algo 2, begin of digest 9a d2
hashed subpkt 2 len 4 (sig created 2014-06-15)
subpkt 16 len 8 (issuer key ID 8E78E44DFB1B55E9)
data: [4095 bits]
当然,加密的 OpenPGP 消息也可以签名。我将编写验证命令的任务留给感兴趣的读者作为练习。
获取公钥
使用从签消息,可以从密钥服务器获取密钥。大多数邮件客户端(插件)会自动为您执行此操作:
$ gpg --recv-keys 0x8E78E44DFB1B55E9
gpg: requesting key FB1B55E9 from hkp server pool.sks-keyservers.net
gpg: key A4FF2279: "Jens Erat (born 1988-01-19 in Stuttgart, Germany)" not changed
gpg: Total number processed: 1
gpg: unchanged: 1
如果消息未签名,您(或您的 OpenPGP 客户端)可能会在密钥服务器中搜索对方的邮件地址。结果是一样的,您仍然无法确定该密钥的有效性。
答案2
因此,我采取了更直接的方式来寻找这个问题。 埃尼盖尔有一个不错的网站和一本很好的手册,其中为像我这样的喜欢加密但在编码中迷失的普通用户解释了很多有关其操作的信息。
在《HTML 版本的手册,Enigmail 需要使用收件人的公钥来加密消息,以便他们阅读。如果您还没有他们的公钥,那么显然它可能能够在密钥服务器上找到公钥。这在手册第 7 部分。