【发布时间】:2017-10-03 06:35:43
【问题描述】:
在 RSA 中,您基本上有两个用于解密的素数和用于加密的乘积。通常,您将解密密钥设为私有并公开加密,但是对于 CA 签名验证,角色是相反的 - CA 加密签名,浏览器解密它,因此解密密钥是公开的。这意味着这两个质数是公开的,一旦知道它们,每个人都可以将它们相乘并获得超级机密 CA 私钥。我在这里错过了什么?
【问题讨论】:
标签: ssl certificate rsa signature verification
在 RSA 中,您基本上有两个用于解密的素数和用于加密的乘积。通常,您将解密密钥设为私有并公开加密,但是对于 CA 签名验证,角色是相反的 - CA 加密签名,浏览器解密它,因此解密密钥是公开的。这意味着这两个质数是公开的,一旦知道它们,每个人都可以将它们相乘并获得超级机密 CA 私钥。我在这里错过了什么?
【问题讨论】:
标签: ssl certificate rsa signature verification
通常您将解密密钥设为私有并公开加密,但是对于 CA 签名验证,角色是相反的 - CA 加密签名并且浏览器解密它,因此解密密钥是公开的。
签名是在服务器端使用只有服务器知道的私钥完成的。签名由客户端使用公钥进行验证。这意味着只有公钥是公开的,而私钥在服务器上是保密的。
这意味着你假设两个素数都是公开的是错误的。
【讨论】:
CA加密签名,浏览器解密,所以解密密钥是公开的
不,CA 用私钥签署消息;其他人可以验证使用公钥的消息。
我在这里错过了什么?
混淆可能来自许多人学习签名如何工作的方式,特别是因为他们了解 RSA,因为“加密”是 m^e % n,而“解密”是 m^d % n。然后您会了解到“签名”是私钥证明,由m^d % n 完成,而“验证”通过m^e % n 完成,并将预期结果与消息摘要进行比较。结论:签名 == 解密。
你被教导的原因是,如果你使用“合理的”有效载荷大小(即任何大小足够大到甚至保存一个 MD5 哈希(128 位),这将需要 216 位的最小密钥大小,导致使用 5.26e64 < d < 1.06e65 进行 ModExp)
对于 RSA 加密(PKCS#1 v1.5 填充),您获取原始消息字节并在它们前面加上
所以加密其实是(00 02 padding 00 m)^e % n;或更笼统地说pad(m)^e % n(另一种加密填充选项OAEP 的工作方式非常不同)。解密现在将其反转,变为depad(m^d % n)。
另一方面,签名使用不同的填充:
计算T = DER-Encode(SEQUENCE(hashAlgorithmIdentifier, hash(m)))
构造
同样,更通用的形式是 pad(m)^d % n。 (RSA签名有第二种填充模式,称为PSS,完全不同)
现在签名验证出现偏差。公式为verify(m^e % n)。 PKCS#1 签名填充 (RSSA-PKCS1-v1_5) 的最简单、最正确的验证形式是:
PSS 验证非常不同。 PSS 填充 a) 增加了 PKCS#1 签名填充所没有的随机性,并且 b) 有一个验证公式,它只显示“正确”或“不正确”而不显示预期的消息哈希应该是什么。
所以私钥总是(n, d),公钥总是(n, e)。并且签名和解密并不是一回事(但它们都涉及“私钥操作”)。 (私钥也可以认为是三元组(p, q, e),或五元组(p, q, dp, dq, qInv),但让我们保持简单:))
有关更多信息,请参阅最新版本的 RSA 规范(包括 OAEP 和 PSS,以及 PKCS#1 加密和 PKCS#1 签名)RFC 8017。
【讨论】:
通常您将解密密钥设为私有并公开加密,但是对于 CA 签名验证,角色是相反的 - CA 对签名进行加密,而浏览器对其进行解密,因此解密密钥是公开的。
没有。签名用私钥签名并用公钥验证。就隐私而言,没有密钥的角色反转。如果有,数字签名将一文不值,不再具有法律约束力。
这意味着两个素数是公开的
不,它没有。
我在这里错过了什么?
大部分。
【讨论】:
CA 是处理数字证书的受信任机构。在 RSA 数字签名中,您拥有用于签名的私钥和用于验证签名的公钥。您的浏览器拥有所有主要 CA 的公钥。浏览器使用此公钥来验证由受信任 CA 签名的 Web 服务器的数字证书。所以私钥不是公开的,你不能破坏它。您可以通过简单的 google 搜索来清楚地了解 CA 和数字证书。
【讨论】: