我可以检查谁可以在我加密后解密我的 GPG 消息吗?

信息安全 加密 pgp
2021-08-12 09:33:43

例如,当我使用 GPG 向 Alice 和 Bob 发送一个很棒的漏斗蛋糕食谱时,我可以很确定他们都能够解密它。但是,我可以确定,或者事后证明,他们将是唯一可以做到的人吗?*

上下文:我认为这很简单:gpg 消息有一个可能的解密密钥 ID 列表,我认为它总是可以保证是完整的。但是,后来我偶然发现了--try-all-secretsgpg 本身的选项,现在我不确定了。如果我正确理解选项,我可以拥有一个能够解密消息但不在“公共”收件人列表中的密钥。“公共”列表可能有一个全零的密钥 ID,以显示正在发生的事情,但似乎并不总是需要这样做。所以,这让我想到...

问题:如果有人修改了我的版本gpg以秘密将 Eve 添加为匿名收件人,我是否能够判断(仅基于加密的输出)?我需要成为收件人之一才能知道吗?

我知道这种情况在实践中可能永远不会发生,如果攻击者能够替换你的gpg二进制文件,这种情况可能是你最不担心的,但我仍然很好奇。


*:当然假设他们的私钥是保密的,没有人贿赂 Alice 分享获胜的配方,等等。

2个回答

您不一定能通过查看给定的 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-keyand标志。--override-session-key这些将让您直接处理会话密钥,而不是将其隐藏在加密的密钥包中。如果 Eve 替换了您的gpg二进制文件,她可以(例如)通过电子邮件将您加密的每个文件的会话密钥连同加密数据的哈希一起通过电子邮件发送给她,以便于识别。这违反了之前的“没有先验知识”假设,但我觉得这些标志的存在使它值得一提。

试试这个:

# gpg -d your_encrypted_file > /dev/null

gpg:使用 2048 位 ELG 密钥加密,ID 245AC23E80C4A478,创建于 2005-12-17]
     “鲍比 - bobby@gmail.com”
gpg:使用 4096 位 RSA 密钥加密,ID CB6D005B993F02AB,创建于 2020-04-08
      “玛丽 - Mary@gmail.com”
gpg:使用 4096 位 RSA 密钥加密,ID 8AB5B9CEB6F0B2D2,创建于 2018-11-29
      “贝蒂刘 - bettyliu@gmail.com”

( -d 标志用于解密文件。当 GPG 解密时,它会将每个密钥的信息发送到 STDERR,STDERR 将显示在您的屏幕上。对于正常解密,您会将 STDOUT 重定向到文件,但在这种情况下,我们实际上并不关心文件内容,所以我们将它重定向到 /dev/null。)