如何使用 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 madeGood signature 行。