【问题标题】:Why is an OpenSSL::PKey::RSA key both private and public?为什么 OpenSSL::PKey::RSA 密钥既是私有的又是公有的?
【发布时间】:2017-03-27 23:12:24
【问题描述】:
我正在学习OpenSSL ruby 模块。
下面显示的是一个 pry session,我使用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> 对象既是公共的又是私有的?
【问题讨论】:
标签:
ruby
openssl
cryptography
rsa
【解决方案1】:
通常私钥的数据结构也包含公共指数。它们首先在同一密钥 pair 生成中生成。
很容易将它们存储在一起,因为公钥是模数 + 公共指数(通常是值 0x10001,费马的第四个素数)。模数当然也是私钥的一部分,所以不需要复制。
公钥也可用于防止某些侧信道攻击,尽管这在软件中并不是什么大问题。
私钥是否也可以用作公钥以及公钥是否与私钥一起存储取决于软件。但它很常见,例如PKCS#11 中的私钥对象(用于软件、智能卡和 HSM)也包含公共指数。另一方面,Java 有单独的 PrivateKey 和 PublicKey 类,其中 PrivateKey 不包含公共指数(或者它不通过公共 API 公开它)。
最后,如果不咨询最初的 OpenSSL 人员(我想是 Young 先生和 Hudson 先生),我们就无法回答这个问题,但存储公共指数也是有充分理由的,而且由于公钥是公开的,因此它不会也不疼。