您不一定能通过查看给定的 GPG 文件来判断谁可以解密它,但是假设除了他们自己的私钥和加密文件本身之外没有人知道任何知识,则可以知道有多少人可以解密。
当您加密消息时,GPG 会生成一个随机对称密钥,称为“会话密钥”,并使用它来加密消息。然后它会制作一堆会话密钥副本,并使用不同的公钥对每个副本进行加密,每个接收者一个。然后,它使用OpenPGP 容器格式将所有这些加密的“密钥包”与加密消息一起打包。
重要的是,如果您只有加密文件,您必须能够解密这些加密会话密钥数据包中的至少一个,才能获取消息。
gpg --list-packets
您可以使用以下命令列出加密文件中的所有数据包:
$ gpg --batch --list-packets myfile.gpg
:pubkey enc packet: version 3, algo 16, keyid 0000000000000000
data: [2048 bits]
data: [2046 bits]
gpg: anonymous recipient; trying secret key ABCDE123 ...
:pubkey enc packet: version 3, algo 16, keyid 123ABCDE0987654F
data: [2048 bits]
data: [2046 bits]
:encrypted data packet:
...
(该--batch
标志阻止 GPG 向我询问我的密码,因此它无法解密任何内容。如果您正在运行 GPG 代理,则需要更多的时间。)
那些“公钥加密数据包”是从文件中读取的加密会话密钥数据包。带有“keyid 123ABCDE0987654F”的为普通收件人;密钥 ID 是一个提示,告诉您可以使用哪个密钥来解密数据包。带有“keyid 0000000000000000”的那个是匿名接收者:你不知道哪个密钥会解密它,但你知道它在那里等待被某些东西解密。如果您gpg
被修改为将 Eve 添加为匿名收件人,那么您在使用干净的gpg
二进制文件检查 .gpg 文件时会看到这种情况。如果您故意添加匿名收件人,这也是您会看到的。
不过,如果 Eve 更聪明一点,那么有几种方法可以进一步隐藏收件人:
- 列出的 keyid 值可能是谎言。全零 keyid 只是一个约定,普通的 keyid 只是一个提示:那里可能有任何东西。Eve 可以使用 Bob 的 keyid 标记她的加密密钥包,并用她的替换 Bob 的合法包。它看起来像是给 Bob 的一个数据包,但如果他试图使用它,解密就会失败。只有鲍勃能够检查这一点。该标志有点相关,如果 keyid意外错误
--try-all-secrets
,它可能很有用。
- Eve 不必将她的密钥包放入文件中,甚至根本不需要为自己创建一个加密的密钥包。在没有敏感数据的虚拟文件上尝试
--show-session-key
and标志。--override-session-key
这些将让您直接处理会话密钥,而不是将其隐藏在加密的密钥包中。如果 Eve 替换了您的gpg
二进制文件,她可以(例如)通过电子邮件将您加密的每个文件的会话密钥连同加密数据的哈希一起通过电子邮件发送给她,以便于识别。这违反了之前的“没有先验知识”假设,但我觉得这些标志的存在使它值得一提。