【问题标题】:What prevents CA private key from being calculated based on CA public key?是什么阻止了根据 CA 公钥计算 CA 私钥?
【发布时间】:2017-10-03 06:35:43
【问题描述】:

在 RSA 中,您基本上有两个用于解密的素数和用于加密的乘积。通常,您将解密密钥设为私有并公开加密,但是对于 CA 签名验证,角色是相反的 - CA 加密签名,浏览器解密它,因此解密密钥是公开的。这意味着这两个质数是公开的,一旦知道它们,每个人都可以将它们相乘并获得超级机密 CA 私钥。我在这里错过了什么?

【问题讨论】:

    标签: ssl certificate rsa signature verification


    【解决方案1】:

    通常您将解密密钥设为私有并公开加密,但是对于 CA 签名验证,角色是相反的 - CA 加密签名并且浏览器解密它,因此解密密钥是公开的。

    签名是在服务器端使用只有服务器知道的私钥完成的。签名由客户端使用公钥进行验证。这意味着只有公钥是公开的,而私钥在服务器上是保密的。

    这意味着你假设两个素数都是公开的是错误的。

    【讨论】:

      【解决方案2】:

      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 填充),您获取原始消息字节并在它们前面加上

      • 0x00
      • 0x02
      • (n.Length - m.Length - 3) 随机非零值(至少 8 个)
      • 0x00

      所以加密其实是(00 02 padding 00 m)^e % n;或更笼统地说pad(m)^e % n(另一种加密填充选项OAEP 的工作方式非常不同)。解密现在将其反转,变为depad(m^d % n)

      另一方面,签名使用不同的填充:

      1. 计算T = DER-Encode(SEQUENCE(hashAlgorithmIdentifier, hash(m)))

      2. 构造

      • 0x00
      • 0x01
      • (n.Length - T.Length - 3) 零值填充字节
      • 0x00
      • T

      同样,更通用的形式是 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

      【讨论】:

        【解决方案3】:

        通常您将解密密钥设为私有并公开加密,但是对于 CA 签名验证,角色是相反的 - CA 对签名进行加密,而浏览器对其进行解密,因此解密密钥是公开的。

        没有。签名用私钥签名并用公钥验证。就隐私而言,没有密钥的角色反转。如果有,数字签名将一文不值,不再具有法律约束力。

        这意味着两个素数是公开的

        不,它没有。

        我在这里错过了什么?

        大部分。

        【讨论】:

        • 好吧,你是说产品是公开的,这是加密的密钥,不是解密的。如何使用加密密钥验证签名内容?您需要一个解密密钥来打开签名。
        【解决方案4】:

        CA 是处理数字证书的受信任机构。在 RSA 数字签名中,您拥有用于签名的私钥和用于验证签名的公钥。您的浏览器拥有所有主要 CA 的公钥。浏览器使用此公钥来验证由受信任 CA 签名的 Web 服务器的数字证书。所以私钥不是公开的,你不能破坏它。您可以通过简单的 google 搜索来清楚地了解 CA 和数字证书。

        【讨论】:

          猜你喜欢
          • 2019-10-19
          • 2018-07-26
          • 1970-01-01
          • 1970-01-01
          • 2019-05-25
          • 2011-01-21
          • 2011-03-25
          • 2012-12-17
          • 2019-10-10
          相关资源
          最近更新 更多