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 文件(如我的示例中),并准确查看消息被加密给谁;向他们表明,这往往会坚定地阻止“你的软件插件已损坏”游戏的发展。
在较新版本的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。