openssl - 从 PEM 到 DER 的 RSA public 密钥

openssl - RSA public key from PEM to DER

我在使用 openssl 翻译 RSA 公钥时遇到问题,我想获得 DER 格式的 public 密钥。这是我所做的:

  1. 生成RSA密钥对 openssl genrsa -out alice.key 1024

  2. 仅从 my.key 导出 public 密钥 a) openssl rsa -in alice.pem -RSAPublicKey_out -out alice_pub.pem b) openssl rsa -in alice.pem -pubout -out alice_pub2.pem

这两种方法在 .pem 中生成不同的页脚:第一种方法输出 --Begin RSA public key ----,第二个输出 -- Begin Public key ----

  1. 在使用openssl asn1parse分析public两个关键pem文件openssl asn1 parse -inform PEM -in alice_pub.pem时,发生了意想不到的事情。 对于alice_pub.pem,效果不错;对于 alice_pub2.pem,openssl 无法提取 "N" 和 "E" 参数,表明它们是 "rsaEncryption"。

  2. openssl只能将第二个pem转为DER,但是pem内容明显不对...

请告诉我如何解决这个问题。非常感谢。这个问题很容易重现。

当您说 OpenSSL 只能将第二个 PEM 转换为 DER 时,您的意思不清楚 - openssl asn1parse 可以读取两者并将两者都输出为 DER。

-RSAPublicKey_out 的输出只是 public 键,没有额外的包装,当通过 openssl asn1parse 时,您会得到以下内容:

    0:d=0  hl=3 l= 137 cons: SEQUENCE
    3:d=1  hl=3 l= 129 prim: INTEGER           :...
  135:d=1  hl=2 l=   3 prim: INTEGER           :010001

然而 -pubout 产生的输出是一个 X509 格式的 public 密钥,当通过 openssl asn1parse 时,你会得到以下输出:

    0:d=0  hl=3 l= 159 cons: SEQUENCE
    3:d=1  hl=2 l=  13 cons: SEQUENCE
    5:d=2  hl=2 l=   9 prim: OBJECT            :rsaEncryption
   16:d=2  hl=2 l=   0 prim: NULL
   18:d=1  hl=3 l= 141 prim: BIT STRING

此格式将 public 密钥(未解码显示为 BIT STRING)与一个指示符,表明它是 RSA public 密钥(rsaEncryption).

您可以使用 openssl asn1parse-strparse 选项在 -pubout 输出中显示编码的 public 密钥的详细信息。在上面的输出中,您可以看到 BIT STRING 位于偏移量 18,因此使用:

openssl asn1parse -inform PEM -in alice_pub2.pem -strparse 18

您将得到如下内容:

    0:d=0  hl=3 l= 137 cons: SEQUENCE
    3:d=1  hl=3 l= 129 prim: INTEGER           :...
  135:d=1  hl=2 l=   3 prim: INTEGER           :010001

换句话说,与 openssl rsa-RSAPublicKey_out 选项生成的原始 RSA public 密钥完全相同的数据。