我使用 GPG 签署我的外发电子邮件。
我了解当我加密邮件以发送给其他人时它是如何工作的。然后我需要他/她的公钥,用它加密,只有他可以用他的私钥解密。
我从签署我的外发邮件中了解到,我使用我的私钥来做到这一点。收件人不需要使用 GPG(阅读邮件),我也不需要他们的公钥。我想我的公钥被接收者用来检查签名是否合法,但也许我误解了。
他们如何使用我的公钥来验证我的签名是否有效?
我使用 GPG 签署我的外发电子邮件。
我了解当我加密邮件以发送给其他人时它是如何工作的。然后我需要他/她的公钥,用它加密,只有他可以用他的私钥解密。
我从签署我的外发邮件中了解到,我使用我的私钥来做到这一点。收件人不需要使用 GPG(阅读邮件),我也不需要他们的公钥。我想我的公钥被接收者用来检查签名是否合法,但也许我误解了。
他们如何使用我的公钥来验证我的签名是否有效?
公钥和私钥之间存在唯一的关联。也就是说,如果发送者使用某个私钥对消息进行签名,而您使用相应的公钥验证签名,则只有在消息没有被更改的情况下,签名验证才会成功。¹
公共和私有之间关联的验证过程和性质因您正在考虑的密码系统(RSA、DSA 等)而异,但上述陈述适用于任何非对称方案。
真正重要的是发件人是唯一可以产生有效签名的人,因为他/她是唯一知道私人的人,但任何人都知道公众,因此任何人都可以验证签名。
签名后,GPG 会在文本消息中添加一个令牌,该令牌可用于验证消息在传输过程中没有被更改:这就是签名。您不需要 GPG 来阅读消息,因为文本本身没有加密,只有一个额外的令牌,它可以是消息末尾的 radix64 编码的 blob 或具有类似结构的文本附件。
GPG 不直接签署消息²,它签署它的加密哈希(通常是 SHA-1 或 SHA-2)。验证时发生的情况是使用发送者的公钥验证签名,以确保接收到的哈希实际上是由发送者发起的。如果发件人计算的散列被认为是真实的,则将其与收件人计算的散列进行比较。如果两个阶段都成功,则消息已正确签名。
[¹] 实际上,理论上有可能通过生成所谓的哈希冲突来打破此规则。也就是说,不同的消息具有相同的哈希(见最后一段)。已经为 MD5 生成了冲突,而为 SHA-3、SHA-2 和 SHA-1 找到一个被认为是不可行的,尽管最后一个的安全边际变得如此之薄,建议现在停止使用它。
[²] 对于某些密码系统,如 DSA,签名哈希是唯一的可能性。
签署数据是为了向其他人证明它来自您。通过使用您的私钥(只有您拥有)签名,您可以确保任何拥有您的公钥的人都可以验证消息。你不使用他们的公钥,但他们有你的。
签名本身是使用您的私钥签名的整个消息的加密哈希。对消息的任何更改都会生成不正确的哈希。由于发件人应该是唯一拥有私钥的人,因此在通信过程中的任何人都不应该能够复制该签名。接收方使用计算自己的哈希值,然后将其与已签名的哈希值进行比较。
这是安全的,因为如果消息被更改并使用不同的私钥签名,接收者仍将尝试使用原始发送者的公钥进行解密。这将生成不正确的值,并且消息将不会被验证。