我试图更好地了解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
,它会验证和解密它,但是如果我只想验证怎么办?
我想出了这个问题的答案,然后是一些。因此,为了清楚起见,我将添加一些其他信息。
首先,我意识到根据这个答案的最后一行,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 made
和Good signature
行。
我知道我来得太晚了。
您知道gpg
的--decrypt
操作,在这种情况下,该操作"解密和验证"消息。你在自己的回答中说得很好,你很好地解释了所需的钥匙。
要确认两步程序,可以一步一步
gpg -vi --output signed.gpg --unwrap signed_and_encoded.gpg
它执行第一步,即解密。 生成的文件现已解码并包含签名。
这表明gpg --sign --encrypt file
的产品不能不解密就验证,但可以在不(尚未(验证的情况下解密。解密的(--unwrap
ped(文件可以在以后由gpg -d
验证(和显示(,只需要发送者的公钥。
更多和文档链接可以在我的回答中找到 这里
$ gpg --encrypt --sign -r test@email.com file.txt
生成 file.txt.gpg 后,请尝试以下命令:
$ gpg -d file.txt.gpg
或者只是执行:
$ gpg file.txt.gpg