openssl-从PEM到DER的RSA公钥

openssl-从PEM到DER的RSA公钥,openssl,cryptography,Openssl,Cryptography,我在使用openssl转换RSA pub密钥时遇到了一个问题,我想获得DER格式的公钥。以下是我所做的: 生成RSA密钥对 openssl genrsa-out alice.key 1024 仅从my.key导出公钥 a) openssl rsa-in alice.pem-RSAPublicKey\u out-out alice\u pub.pem b) openssl rsa-in alice.pem-pubout-out alice_pub2.pem 这两种方法在.pem中生成不同的页脚:第

我在使用openssl转换RSA pub密钥时遇到了一个问题,我想获得DER格式的公钥。以下是我所做的:

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

  • 仅从my.key导出公钥 a) openssl rsa-in alice.pem-RSAPublicKey\u out-out alice\u pub.pem b) openssl rsa-in alice.pem-pubout-out alice_pub2.pem

  • 这两种方法在.pem中生成不同的页脚:第一种方法输出
    --开始RSA公钥--
    ,第二次输出
    --开始公钥--

  • 在alice_pub.pem中,使用openssl asn1 parse分析两个公钥pem文件时,
    openssl asn1 parse-通知pem-发生了意外情况。
    对于alice_pub.pem来说,它工作得很好;对于alice_pub2.pem,openssl无法提取“N”和“E”参数,表明它们已被“rsa加密”

  • Openssl只能将第二个pem转换为DER,但是,pem的内容显然是不正确的


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

    当您说OpenSSL只能将第二个PEM转换为DER时,不清楚您的意思是什么-
    OpenSSL asn1parse
    可以读取这两个PEM并将其作为DER输出

    -RSAPublicKey\u out
    的输出只是公钥,没有额外的包装,当通过
    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
    
        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格式的公钥,当通过
    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
    
    此格式将公钥(未编码显示为
    位字符串
    )包装为RSA公钥(
    RSA加密

    您可以使用
    openssl asn1parse
    -strparse
    选项,在
    -pubout
    输出中显示编码公钥的详细信息。在上述输出中,您可以看到
    位字符串
    位于偏移量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
    
        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
    

    换句话说,与原始RSA公钥完全相同的数据由
    -RSAPublicKey\u out
    选项为
    openssl RSA

    生成,这非常有用。