为什么OpenSSL :: PKey :: RSA密钥既是私有的又是公共的?

时间:2017-03-27 23:12:24

标签: ruby openssl cryptography rsa

我正在学习OpenSSL ruby​​模块。

下面显示的是一个pry会话,我使用RSA非对称公钥算法生成密钥。我还调用#private?#public?实例方法:

[1] pry(main)> require 'openssl'
=> true
[2] pry(main)> alices_key = OpenSSL::PKey::RSA.new 2048
=> #<OpenSSL::PKey::RSA:0x007fc0751cb028>
[3] pry(main)> alices_key.public?
=> true
[4] pry(main)> alices_key.private?
=> true
  • 为什么#<OpenSSL::PKey::RSA:0x007fc0751cb028>对象既是公共的又是私有的?

1 个答案:

答案 0 :(得分:2)

私钥的数据结构通常也包含公共指数。它们首先在相同的密钥生成中生成。

很容易将它们存储在一起,因为公钥是模数+公共指数(通常是值0x10001,费马的第四个素数)。模数当然也是私钥的一部分,因此不需要重复。

公钥也可用于防范某些侧通道攻击,尽管这在软件中并不是一个大问题。

如果私钥也可以用作公钥,并且公共指数与私钥一起存储,则取决于软件。但它很常见,例如PKCS#11中的私钥对象(用于软件,智能卡和HSM)也包含公共指数。另一方面,Java有单独的PrivateKeyPublicKey类,其中PrivateKey不包含公共指数(或者它不会通过公共API公开它)。

最后,如果没有咨询原来的OpenSSL人员(Young先生和Hudson先生,我想),我们无法回答这个问题,但是有充分的理由存储公共指数,而且公钥是公开的,它不会也不疼。