【问题标题】:Are public key and private key interchangeable?公钥和私钥可以互换吗?
【发布时间】:2012-03-01 18:56:21
【问题描述】:

一方面,我听到人们说这两个密钥完全可以互换,第一个将解密第二个加密的内容。这让我觉得这两个键是可以互换的。

但另一方面,RSA 生成的密钥似乎具有不同的长度,在另一个主题上,使用私钥加密被称为“签名”,并且被认为不如使用公钥加密安全。 (2)

最重要的是,当公钥应该在野外公开分发时,私钥应该保持不公开的想法。 (3)

我计划从唯一的服务器接收数据,所以我的想法是在该服务器上保留一个公钥来加密数据,并将私钥分发给所有可能的客户,但这与 (3) 背道而驰。相反,如果我分发公钥并使用私钥加密我的数据,则根据 (2) 进行加密的安全性较低。

我应该分发公钥并使用私钥加密以满足 (2) 还是相反?

注意:就我而言,性能不是问题。

【问题讨论】:

标签: encryption rsa encryption-asymmetric


【解决方案1】:

您的公钥用于加密消息,您的私钥用于解密。因此,使用您分发的公钥,任何人都可以安全地加密消息,因为知道只有您(或拥有您私钥的人)可以解密它。要直接回答您的问题,不,它们不可互换。你永远不应该分发你的私钥。

如果您想与多个可能的客户共享一个密钥,那么实际上有两种选择。要么你放弃非对称加密并找到一种安全的方式来分发对称密钥,以便与 AES 而不是 RSA 之类的东西一起使用,或者你要求他们每个人生成一个密钥对并为你提供他们的公钥。然后您可以解密来自服务器的内容,并为每个客户重新加密。客户数量将决定您在两者之间的选择。

【讨论】:

  • 看起来第二种方法在中间解密和重新加密的开销更大。
【解决方案2】:

答案取决于您是出于对数学的好奇,还是出于纯粹的实用密码学原因提出问题。

  • 如果您正在实施加密系统,您应该永远披露您的私钥,因此从这个意义上说,这些密钥绝对不能互换。此外,您描述的使用场景似乎很适合身份验证而不是机密性,因此服务器发送给客户端的消息确实应该经过签名而不是加密。如果您还需要保密,则需要在协议中执行更多步骤。

  • 从数学的角度来看,答案是OTOH“是”,假设您使用仅包含模数N和指数D的私钥的内部表示,而另一个指数E是随机生成的.描述两个指数之间关系的公式是 1 = E*D (mod phi(N)),所以从数学的角度来看,哪个指数是哪个并不重要。

但另一方面,RSA 生成的密钥似乎有不同的长度

如果您使用的实现生成的 RSA 私钥比相应的公钥长得多,这几乎总是意味着该实现绝对不适合互换使用公钥和私钥。长度的差异通常是由以下几种原因共同造成的:

  • 公共指数 E 不是随机生成的,而是一个小的固定常数,例如 3 或 0x10001。另一方面,私钥 D 几乎与模数一样大,因此私钥数据几乎是公钥数据大小的两倍。如果您只有一个 RSA 私钥 (N,D),那么您对公共指数的第一个猜测将是值 3 或 0x10001,并且很容易检查猜测是否正确。如果您希望密钥可互换,您首先选择的指数必须随机选择为大于 1 且小于 phi(N) 且与 N 或 phi(N) 没有共同质因数的奇数。李>
  • 私钥数据包括公共模数 N 的因子 P、Q。
  • 私钥数据包括公共指数 E。

【讨论】:

  • 感谢您区分数学和实际系统的实际使用。我已经看到该主题以两种方式呈现,并且由于没有进行区分,因此似乎相互矛盾。另外,我认为一些实际的系统将公钥存储在数据文件中,这样如果你知道私钥,你可以提取公钥,导致一些人得出结论,你可以在给定私钥的情况下重新创建公钥。
  • @adg 在某些情况下,保存在私钥中的信息包括质因数 (P,Q) 和私钥 (D)。这足以推导出公共指数 (E)。
  • 非常感谢您的出色说明。似乎声称该对中的密钥在数学或功能上等价的解释是不正确的,至少在某些实现中是这样。
  • @AlexV:私钥永远不会被泄露。签名旨在使用私钥生成。如果您使用的实现是向后执行的,那么您手头可能会遇到重大的安全问题。
  • @HenrickHellström 有人告诉我,数字签名是通过用私钥加密纯文本的哈希来创建的,然后通过用公钥解密密文来验证(也验证哈希)。当第二个指数微不足道时,这仍然是如何完成的吗?谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-09
  • 1970-01-01
  • 2011-11-16
相关资源
最近更新 更多