【问题标题】:Generate public key from private key从私钥生成公钥
【发布时间】:2020-05-03 07:12:45
【问题描述】:

openssl 生成公钥/私钥对时,是不是先生成私钥,再根据私钥计算公钥?还是应该和私钥同时计算公钥?

是否可以有多个公钥匹配同一个私钥?

谢谢

【问题讨论】:

  • 这取决于特定的加密系统。

标签: private-key public-key


【解决方案1】:

至少不是在 RSA 中,事实上,您可以拥有一个公钥和几个“不同”的私钥。在 RSA 中,首先生成公钥,然后生成私钥。这是因为在开始和最终生成私钥之前选择了几个随机选择的值,但是在生成私钥之后它们都被丢弃了。如果保留它们,则可以使用不同的值重做该步骤并仍然使用相同的公钥,但是虽然生成的私钥乍一看会有所不同,但它们是mathematically equal。即使您使用可能创建多个密钥的算法,出于所有意图和目的,它们也是相同的密钥,因为无法推断是否使用一组私钥中的某个密钥进行签名,只有密钥是您拥有的公钥的有效对。

另外,这似乎是一个 X-Y 问题。即使您找到一种为单个私钥创建多个公钥的算法,由于公钥本来就是公开的,因此没有什么可以阻止公众加密相同的消息并观察相同的加密结果。所以你不能有两个不想关联使用这些密钥的秘密演员。正如您特别提到的 OpenSSL,在 SSL 上,您可能会向不同的 CA 提供不同的公钥(假设存在这样的算法,因为正如我指出的那样,它在 RSA 中是相反的),或者可能将它们嵌入到不同的应用程序/设备中,但由于 CA 支持单个cert 服务于多个域/服务器,多个 CA 服务于一个域,目前的做法似乎没有任何好处。

【讨论】:

  • 你说先生成公钥,但是看这个过程: 先生成私钥: openssl ecparam -genkey -name secp256k1 -rand /dev/urandom -out private.txt && openssl ec -in private.txt -pubout -outform DER|tail -c 65|xxd -p -c 65 > public.txt 所以我不明白...
  • 这就是为什么我至少在 RSA 中说的原因,它通常用于 SSL。与此同时,secp256k1 几乎专供 BTC 使用。如果您想要多个公钥,以便您可以有不同的收据地址,请参阅bitcoin.stackexchange.com/questions/68657/…
  • 所以你的意思是先生成 rsa 公钥然后生成私钥?而对于 secp256k1 则相反:首先是私有的,然后是公共的?
  • 在ECDSA(这里使用secp256k1)中,私钥是随机选择的,只有这样才能计算出公钥。