Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Encryption 公钥和私钥可以互换吗?_Encryption_Rsa_Encryption Asymmetric - Fatal编程技术网

Encryption 公钥和私钥可以互换吗?

Encryption 公钥和私钥可以互换吗?,encryption,rsa,encryption-asymmetric,Encryption,Rsa,Encryption Asymmetric,一方面,我听到人们说这两个密钥完全可以互换,第一个密钥将解密第二个密钥加密的内容。这让我觉得这两把钥匙是可以互换的 但另一方面,RSA生成的密钥似乎具有不同的长度,在另一个主题中,使用私钥加密被称为“签名”,被认为比使用公钥加密更不安全。(二) 最重要的是,当公钥应该在野外公开分发时,私钥应该保持秘密。(三) 我计划从一个唯一的服务器接收数据,所以我的想法是在该服务器上保留一个公钥来加密数据,并将一个私钥分发给所有可能的客户,但这与(3)背道而驰。相反,如果我分发公钥并使用私钥加密数据,则根据(

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

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

最重要的是,当公钥应该在野外公开分发时,私钥应该保持秘密。(三)

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

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


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

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


如果您想与多个可能的客户共享密钥,那么实际上有两种选择。要么放弃非对称加密,找到一种安全的方法将对称密钥(与AES(而非RSA)一起使用)分发给它们中的每一个,要么让它们生成密钥对并向您提供它们的公钥。然后,您可以解密来自服务器的内容,并为每个客户重新加密。客户的数量将有助于你在两者之间做出选择。

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

  • 如果您正在实施加密系统,您应该绝不公开您的私钥,因此从这个意义上讲,这些密钥绝对不能互换。此外,您描述的使用场景似乎与身份验证(而非机密性)非常匹配,因此服务器发送给客户端的消息确实应该签名而不是加密。如果您还需要保密性,则需要在协议中执行更多步骤

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

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

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

  • 公共指数E不是随机生成的,而是一个小的固定常数,如3或0x10001。另一方面,私钥指数D几乎与模一样大,因此私钥数据的大小几乎是公钥数据的两倍。如果您只获得了一个RSA私钥(N,D),那么您对公共指数的第一个猜测将是值3或0x10001中的一个,并且很容易检查猜测是否正确。如果希望关键点可以互换,则必须将首先选取的指数随机选取为大于1且小于φ(N)的奇数整数,且不具有与N或φ(N)相同的素数因子
  • 私钥数据包括公模N的因子P、Q
  • 私钥数据包括公开指数E

没有?永远不要分发私人密钥签名,因为它的安全性并不比加密差。感谢您将数学和实际系统的使用区分开来。我已经看到了这个话题的两种表达方式,而且它似乎是矛盾的,因为没有进行区分。此外,我认为一些实用的系统将公钥存储在数据文件中,这样,如果您知道私钥,您就可以提取公钥,从而使一些人得出结论,在给定私钥的情况下,您可以重新创建公钥。@adg在某些情况下,私钥中保存的信息包括基本因子(P,Q)和私有指数(D)。这就足以推导出公共指数(E)。非常感谢您的出色澄清。似乎声称这对密钥在数学上或功能上是等价的解释是不正确的,至少在某些实现中是如此。@AlexV:私钥从未公开过。签名将使用私钥生成。如果您使用的实现是反向执行的,那么您可能面临一个重大的安全问题。@HenrickHellström我被告知,数字签名是通过使用私钥加密纯文本的散列来创建的,然后通过使用公钥解密密文来验证(也验证散列)。当第二个指数微不足道时,它仍然是这样做的吗?谢谢看起来第二种方法在中间解密和重加密的开销很大。