如何检查 GPG 加密文件是否使用特定公钥加密?

Yog*_*oga 5 security encryption public-key public-key-encryption gnupg

考虑是否使用命令加密文件

例如

gpg --output test.txt.gpg --encrypt --recipient test@example.com test.txt
Run Code Online (Sandbox Code Playgroud)

现在,考虑另一个人收到test.txt.gpg了 pub key test@example.com,如何执行检查以确保文件确实是使用 pub key 加密的?

小智 10

您甚至不必拥有公钥(只需知道它的 ID 即可)。假设有人没有故意隐藏用于加密文件/消息的密钥,那么您可以使用该list-packets命令来执行您所要求的操作。

gpg --list-packets test.txt.gpg
Run Code Online (Sandbox Code Playgroud)

这将向您显示 PGP 消息/文件标头中列出的每个解密数据包的列表。有多种方法可以加密密钥并从此列表中隐藏该密钥,但使用普通命令(如示例中的命令)将导致列出所有解密密钥,如下所示。

gpg --list-packets crypto-text.pgp
# off=0 ctb=85 tag=1 hlen=3 plen=526
:pubkey enc packet: version 3, algo 16, keyid 2206D60BA555DCB0
        data: [2045 bits]
        data: [2047 bits]
# off=529 ctb=85 tag=1 hlen=3 plen=526
:pubkey enc packet: version 3, algo 16, keyid 0D6229B307ED0210
        data: [2043 bits]
        data: [2048 bits]
# off=1058 ctb=85 tag=1 hlen=3 plen=526
:pubkey enc packet: version 3, algo 16, keyid 0E9AFA6C61A4DC66
        data: [2048 bits]
        data: [2046 bits]
Run Code Online (Sandbox Code Playgroud)

请注意列出的三个不同的密钥 ID。是的,您猜对了,每个密钥都可以用来解密这个特定的消息。

如果您确实拥有公钥,则会加分,因为该--list-packets命令还会告诉您消息标头中每个数据包的友好名称。(并且您可以使用已有的公钥)。

但是,除非有人故意在消息标头的列表中隐藏解密密钥,否则您可以看到所有 PGP 密钥都可用于解密消息,而无需访问其中任何一个的公钥或私钥。

实际上,我承认,我使用此功能的次数要多得多,通常是当我公司的人们正在交换 PGP 消息时,突然有人无法打开消息。他们总是责怪软件的实现。到目前为止,每一次都会起草、加密一条消息,加密后,将新的收件人添加到“收件人”列表中。我可以将密码文本复制到 crypto-text.pgp 文件(如我的示例中),并准确查看消息被加密给谁;向他们表明,这往往会坚定地阻止“你的软件插件已损坏”游戏的发展。


wis*_*cky 7

在较新版本的gpg(我正在测试gpg v2.2.4)中,某些行为发生了变化。它会在执行时提示您输入密码--list-packets。现在默认情况下,-k不再显示密钥 ID,只显示 40 个字符的指纹。

以下是一些将跳过提示并显示密钥 ID 的命令:

# show public key ID that it was encrypted with, skipping prompts
gpg --pinentry-mode cancel --list-packets file.gpg

# list keys with the key IDs
gpg -k --keyid-format long
Run Code Online (Sandbox Code Playgroud)

然后,您可以匹配 16 个字符的密钥 ID from--list-packets到 list from -k


jvb*_*jvb 0

仅当您是收件人私钥的所有者时才可以这样做。如果您无法使用私钥解密该消息,则该消息未使用匹配的公钥加密(或已被修改)。

但能够逆转加密只是一个(尽管很强)指示,而不是证明。作为对创作性(和完整性)的真正考验,采用了签名,请参见此处。请注意,完全可以使用不同的密钥进行签名和加密。并且有讨论作为发送者是否应该首先签名,然后加密,或者反之亦然。