当我使用gpg验证一个签名的文件时,它是如何知道要使用哪个公钥?

当我签署文件时,我可以选择要使用的密钥,例如:像这样:
gpg --default-key=BF8C1203 --clearsign message.txt

当我验证一个文档时,我没有看到这个选项,我只能做以下操作:
gpg --verify message.txt.asc

GPG如何知道要使用哪个公钥进行验证?有没有办法告诉它使用不同的公钥?
1个回答

gpg 检查签名与您拥有的所有公钥匹配。

如果您有两个私钥,那么您应该也有相应的公钥。因此,gpg 将检查您拥有的所有公钥,包括您朋友的公钥,并确定是谁对文件进行了签名。

如果文件由我签名,而您没有我的公钥,那么gpg 无法验证我的签名,直到您从公共密钥存储库(如https://pgp.mit.edu/)下载我的公钥。

更详细的解释请参考https://security.stackexchange.com/questions/82490/when-signing-email-with-gpg-how-does-verification-by-the-receiver-work

公钥和私钥之间存在着独特的关联。也就是说,如果发送方使用特定的私钥对消息进行签名,并且您使用相应的公钥进行签名验证,那么只有在消息没有被篡改的情况下,签名验证才会成功。
公钥和私钥之间的验证过程和关联性取决于您考虑的密码系统(RSA、DSA等),但上述陈述对任何非对称方案都成立。
真正重要的是,发送方是唯一能够产生有效签名的人,因为他/她是唯一知道私钥的人,而任何人都知道公钥,所以任何人都可以验证签名。
在签名时,GPG会向文本消息添加一个标记,用于验证消息在传输过程中是否被篡改:这就是签名。您不需要GPG来阅读消息,因为文本本身并未加密,只有额外的标记,可以是消息末尾的基于64进制编码的块,也可以是具有类似结构的文本附件。
GPG并不直接对消息进行签名,而是对其进行密码哈希(通常是SHA-1或SHA-2)的签名。在验证过程中,使用发送方的公钥来验证签名,以确保接收到的哈希实际上是由发送方生成的。如果发送方计算的哈希被认为是可信的,则将其与接收方计算的哈希进行比较。如果两个阶段都成功,那么消息就正确签名了。
希望这能帮到你。