如何使用 gpg 验证加密和签名的文件?



我试图更好地了解gpg的情况。

如果您有文件并签名:gpg --sign file.txt

您可以通过以下方式进行验证:gpg --verify file.txt.gpg

当您获得成功的输出时:gpg: Signature made...

但是当您对文件进行签名和加密时:gpg --encrypt --sign -r test@email.com file.txt

然后在我得到的加密文件上运行--verifygpg: verify signatures failed: Unexpected error

我知道我可以在文件上调用--decrypt,它会验证和解密它,但是如果我只想验证怎么办?

我想出了这个问题的答案,然后是一些。因此,为了清楚起见,我将添加一些其他信息。

首先,我意识到根据这个答案的最后一行,gpg使用签名然后加密。这意味着调用--verify或任何变体来验证加密文件只会输出gpg: verify signatures failed: Unexpected error。发生这种情况是因为签名在加密中"隐藏",因此当您尝试对文件调用--verify时,它不会看到签名。

其次,--decrypt标志将解密文件,如果文件已签名,则也对其进行验证。

这是--decrypt正在做的事情。它会查看默认密钥环secring.kbx~/.gnupg使用密钥解密文件。然后,在解密后,它会查看文件夹中的默认公钥环pubring.kbx~/.gnupg,并尝试验证文件上的签名(如果有(。

  • 如果它没有签名,它只会解密文件。

  • 如果它有签名,但你没有公钥,它将解密文件,但无法验证签名。

  • 如果它有签名并且您有公钥,它将解密并验证。

话虽如此,没有理由在解密之前验证签名文件。

第三,作为额外的奖励,您还可以指定要用于解密和验证的密钥环。假设您想使用临时密钥环来验证签名,或者出于某种原因,您也希望临时密钥环来解密消息。

您可以使用以下命令指定--decrypt使用的密钥环:

gpg --secret-keyring path/to/temp/secring.kbx --keyring path/to/temp/pubring.kbx --decrypt file.txt.gpg

此命令将在指定路径上查找秘密环和公共环,以便使用这些环进行解密和验证,而不是在~/.gnupg中找到的默认环。想要将默认戒指与临时戒指一起使用?只需省略要默认的环的标志和路径即可。

总而言之,对于加密和签名的文件,如果要解密和验证该文件,则需要确保用于解密的私钥位于您的密钥环中,用于验证的公钥位于您的公钥环中。

关于GPG加密和签名,需要了解的一件事是,签名只能由收件人验证

假设 Alice 加密了一个要发送给 Bob 的文件。她将使用 Bob 的公钥进行加密,并使用她的私钥进行签名。

gpg --output encrypted.gpg --recipient B0B0000000000000000000000000000000000000 --armor --sign --default-key A11CE00000000000000000000000000000000000 --encrypt file-to-encrypt.txt

现在,Alice或任何没有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行。

我知道我来得太晚了。

您知道gpg--decrypt操作,在这种情况下,该操作"解密和验证"消息。你在自己的回答中说得很好,你很好地解释了所需的钥匙。

要确认两步程序,可以一步一步

gpg -vi  --output signed.gpg    --unwrap  signed_and_encoded.gpg 

它执行第一步,即解密。 生成的文件现已解码并包含签名。

这表明gpg --sign --encrypt file的产品不能不解密就验证,但可以在不(尚未(验证的情况下解密。解密的(--unwrapped(文件可以在以后由gpg -d验证(和显示(,只需要发送者的公钥。

更多和文档链接可以在我的回答中找到 这里

$ gpg --encrypt --sign -r test@email.com file.txt

生成 file.txt.gpg 后,请尝试以下命令:

$ gpg -d file.txt.gpg

或者只是执行:

$ gpg file.txt.gpg

最新更新