如何使用 gpg 验证加密和签名的文件?
How do you verify an encrypted and signed file with gpg?
我正在尝试更好地了解 gpg 的情况。
如果您有文件并签名:gpg --sign file.txt
您可以通过以下方式验证:gpg --verify file.txt.gpg
成功后输出:gpg: Signature made...
但是当您对文件进行签名和加密时:gpg --encrypt --sign -r test@email.com file.txt
然后 运行 --verify
在我得到的加密文件上: gpg: verify signatures failed: Unexpected error
我知道我可以在文件上调用 --decrypt
它会验证和解密它,但是如果我只想验证怎么办?
我找到了这个问题的答案,然后又找到了一些。因此,为了清楚起见,我将添加一些额外的信息。
首先,我根据 this answer 的最后一行意识到 gpg
使用 SIGN THEN ENCRYPT。这意味着调用 --verify
或任何变体来验证加密文件只会输出 gpg: verify signatures failed: Unexpected error
。发生这种情况是因为签名在加密中“隐藏”了,所以当您尝试对文件调用 --verify
时,它不会看到签名。
其次,--decrypt
标志将解密文件,如果文件已签名,也会对其进行验证。
这是 --decrypt
正在做的事情。它会查看 ~/.gnupg
中的默认密钥环 secring.kbx
以使用密钥来解密文件。然后在解密后,它会查看文件夹 ~/.gnupg
中的默认 public 密钥环 pubring.kbx
并尝试验证文件上的签名(如果有的话)。
如果没有签名,它只会解密文件。
如果它有签名,但您没有 public 密钥,它会解密文件,但无法验证签名。
如果它有签名并且你有public密钥,它会解密并验证。
话虽如此,没有理由在解密之前验证签名文件。
第三,作为额外的好处,您还可以指定要用于解密和验证的密钥环。假设您想使用临时密钥环来验证签名,或者出于任何原因您也想要临时密钥环来解密消息。
您可以指定 --decrypt
的密钥环以与以下命令一起使用:
gpg --secret-keyring path/to/temp/secring.kbx --keyring path/to/temp/pubring.kbx --decrypt file.txt.gpg
此命令将在指定路径查找秘密环和 public 环,以便使用这些环进行解密和验证,而不是在 ~/.gnupg
中找到的默认环。想要将默认铃声与临时铃声一起使用吗?只需省略您想要默认的环的标志和路径。
总而言之,对于加密和签名的文件,如果你想解密和验证该文件,你需要确保用于解密的私钥在你的秘密密钥环中,并且 public 密钥用于验证在您的 public 钥匙圈中。
关于 GPG 加密和签名需要了解的一点是,签名只能由接收者验证。
假设 Alice 加密了一个文件以发送给 Bob。她将使用 Bob 的 public 密钥加密,并使用她的私钥签名。
gpg --output encrypted.gpg --recipient B0B0000000000000000000000000000000000000 --armor --sign --default-key A11CE00000000000000000000000000000000000 --encrypt file-to-encrypt.txt
现在 Alice 或任何没有 Bob 私钥的人都无法验证签名。
现在 Bob 将解密文件。如果已签名,他将在输出中看到有关签名的信息:
$ gpg --decrypt encrypted.gpg > decrypted.txt
gpg: encrypted with 2048-bit RSA key, ID D83A4C12B3840EBA, created 2020-09-24
"Alice <alice@example.com>"
gpg: Signature made 09/28/20 13:16:47 Eastern Daylight Time
gpg: using RSA key A11CE00000000000000000000000000000000000
gpg: Good signature from "Alice <alice@example.com>" [ultimate]
注意输出中的 Signature made
和 Good signature
行。
我正在尝试更好地了解 gpg 的情况。
如果您有文件并签名:gpg --sign file.txt
您可以通过以下方式验证:gpg --verify file.txt.gpg
成功后输出:gpg: Signature made...
但是当您对文件进行签名和加密时:gpg --encrypt --sign -r test@email.com file.txt
然后 运行 --verify
在我得到的加密文件上: gpg: verify signatures failed: Unexpected error
我知道我可以在文件上调用 --decrypt
它会验证和解密它,但是如果我只想验证怎么办?
我找到了这个问题的答案,然后又找到了一些。因此,为了清楚起见,我将添加一些额外的信息。
首先,我根据 this answer 的最后一行意识到 gpg
使用 SIGN THEN ENCRYPT。这意味着调用 --verify
或任何变体来验证加密文件只会输出 gpg: verify signatures failed: Unexpected error
。发生这种情况是因为签名在加密中“隐藏”了,所以当您尝试对文件调用 --verify
时,它不会看到签名。
其次,--decrypt
标志将解密文件,如果文件已签名,也会对其进行验证。
这是 --decrypt
正在做的事情。它会查看 ~/.gnupg
中的默认密钥环 secring.kbx
以使用密钥来解密文件。然后在解密后,它会查看文件夹 ~/.gnupg
中的默认 public 密钥环 pubring.kbx
并尝试验证文件上的签名(如果有的话)。
如果没有签名,它只会解密文件。
如果它有签名,但您没有 public 密钥,它会解密文件,但无法验证签名。
如果它有签名并且你有public密钥,它会解密并验证。
话虽如此,没有理由在解密之前验证签名文件。
第三,作为额外的好处,您还可以指定要用于解密和验证的密钥环。假设您想使用临时密钥环来验证签名,或者出于任何原因您也想要临时密钥环来解密消息。
您可以指定 --decrypt
的密钥环以与以下命令一起使用:
gpg --secret-keyring path/to/temp/secring.kbx --keyring path/to/temp/pubring.kbx --decrypt file.txt.gpg
此命令将在指定路径查找秘密环和 public 环,以便使用这些环进行解密和验证,而不是在 ~/.gnupg
中找到的默认环。想要将默认铃声与临时铃声一起使用吗?只需省略您想要默认的环的标志和路径。
总而言之,对于加密和签名的文件,如果你想解密和验证该文件,你需要确保用于解密的私钥在你的秘密密钥环中,并且 public 密钥用于验证在您的 public 钥匙圈中。
关于 GPG 加密和签名需要了解的一点是,签名只能由接收者验证。
假设 Alice 加密了一个文件以发送给 Bob。她将使用 Bob 的 public 密钥加密,并使用她的私钥签名。
gpg --output encrypted.gpg --recipient B0B0000000000000000000000000000000000000 --armor --sign --default-key A11CE00000000000000000000000000000000000 --encrypt file-to-encrypt.txt
现在 Alice 或任何没有 Bob 私钥的人都无法验证签名。
现在 Bob 将解密文件。如果已签名,他将在输出中看到有关签名的信息:
$ gpg --decrypt encrypted.gpg > decrypted.txt
gpg: encrypted with 2048-bit RSA key, ID D83A4C12B3840EBA, created 2020-09-24
"Alice <alice@example.com>"
gpg: Signature made 09/28/20 13:16:47 Eastern Daylight Time
gpg: using RSA key A11CE00000000000000000000000000000000000
gpg: Good signature from "Alice <alice@example.com>" [ultimate]
注意输出中的 Signature made
和 Good signature
行。