RSA算法中,公钥和私钥是否可以互换使用?

22

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

但是另一方面,RSA生成的密钥似乎有不同的长度,在另一个话题中,使用私钥加密被称为“签名”,比使用公钥加密更不安全。(2)

此外,私钥应该保密,而公钥应该在公共场合下公开分发。(3)

我计划从唯一的服务器接收数据,因此我的想法是在该服务器上保存公钥以加密数据,并将私钥分发给所有可能的客户端,但这与(3)相抵触。相反,如果我分发公钥并用私钥加密我的数据,则根据(2),加密会更不安全。

我应该分发公钥并用私钥加密以满足(2),还是反过来呢?

NB: 在我的情况下,性能不是问题。


不要分享私钥。 - sehe
签名并不比加密“不安全”。 - President James K. Polk
可能是加密使用公钥,解密使用私钥?的重复问题。 - balupton
2个回答

50

这个问题的答案取决于您是出于数学好奇还是纯粹为了加密原因提出问题。

  • 如果您正在实现密码系统,您应该永远不会公开您的私钥,因此在这个意义上,密钥绝对不能互换。此外,您描述的使用情况似乎更适合验证而不是机密性,因此服务器向客户端发送的消息确实应该签名而不是加密。如果您需要机密性,您需要在协议中执行更多步骤。

  • 从数学角度来看,答案是"是",假设您使用一个仅包含模数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
    4
    在某些情况下,私钥中保存的信息包括质因数(P、Q)和私有指数(D)。这足以推导出公共指数(E)。 - Henrick Hellström
    @AlexV:私钥永远不会被公开。签名应该使用私钥生成。如果您使用的实现方法是颠倒过来的,那么您可能面临重大的安全问题。 - Henrick Hellström
    @HenrickHellström 我曾经学过数字签名是通过使用私钥加密明文的哈希值来创建的,然后通过使用公钥解密密文(同时验证哈希值)来进行验证。当第二个指数是平凡的时,这种方式仍然适用吗?谢谢! - Adam Winter
    因此,在两个密钥之间没有数学差异,实际上更短的密钥被用作公钥,而更长的密钥则保留为私钥。许多时候,当像openssl这样的工具生成“私钥”时,它们会生成两个密钥的材料,因此可以推断出两个密钥。 - dz902
    显示剩余5条评论

    6
    您的公钥用于加密消息,私钥用于解密。因此,使用您分发的公钥,任何人都可以安全地加密一条消息,并确信只有您(或拥有您的私钥的人)才能解密它。直接回答您的问题,它们不能互换。您不应该分发您的私钥。
    如果您想与多个潜在客户共享密钥,则有两种选择。要么放弃非对称加密,找到一种安全的方式将对称密钥(例如AES)分发给每个客户,要么要求每个客户生成一对密钥并向您提供其公钥。然后,您可以解密来自服务器的内容,并为每个客户重新加密。客户数量将帮助您在这两个选项之间做出选择。

    看起来第二种方法在中间解密和重新加密方面有更多的开销。 - Nora McDougall-Collins

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接