【问题标题】:Converting A public key in SubjectPublicKeyInfo format to RSAPublicKey format java将 SubjectPublicKeyInfo 格式的公钥转换为 RSAPublicKey 格式 java
【发布时间】:2012-12-12 17:08:01
【问题描述】:

PublicKey.getEncoded(),返回一个包含 SubjectPublicKeyInfo (x.509) 格式的公钥的字节数组,如何将其转换为 RSA 公钥编码?

【问题讨论】:

    标签: java cryptography rsa pkcs#1


    【解决方案1】:

    使用 Bouncy Castle 的 SubjectPublicKeyInfo,如下所示:

    byte[] encoded = publicKey.getEncoded();
    SubjectPublicKeyInfo subjectPublicKeyInfo = SubjectPublicKeyInfo.getInstance(
            ASN1Sequence.getInstance(encoded));
    byte[] otherEncoded = subjectPublicKeyInfo.parsePublicKey().getEncoded();
    

    【讨论】:

    • 这不适合pourpose。在这里,我们刚刚将公钥转换为 RSAPublicKey 对象,但是当我说 RSAPublicKey.getEncoded() 时,我仍然得到 x.509 格式而不是 RSA 格式的密钥。
    • 非常感谢!你的方法奏效了。我正在发布我使用的确切 sn-p。
    • @AshishKumarShah 的上述评论似乎不正确;我当然得到了一个 DER 编码的密钥,但它似乎是一个 PKCS#1 格式的密钥(ps Hi Martijn,希望一切都好)。
    • 嘿,马丁。 @AshishKumarShah 的评论可能是关于我在编辑之前的回答(早在 2012 年 :))。
    【解决方案2】:

    没有 BouncyCastle:

    PublicKey publicKey = KeyFactory.getInstance("RSA").generatePublic(new X509EncodedKeySpec(publicKeyBinary));                
    

    【讨论】:

      【解决方案3】:

      以下 sn-p 代码对我有用,但必须使用 BouncyCastle。

      byte[] keyBytes = key.getEncoded(); // X.509 for public key
      SubjectPublicKeyInfo subPkInfo = new SubjectPublicKeyInfo((ASN1Sequence)ASN1Object.fromByteArray(keyBytes));
      byte[] rsaformat = subPkInfo.getPublicKey().getDEREncoded();
      

      【讨论】:

      • getPublicKey() 现已弃用。
      • new SubjectPublicKeyInfo(..) 也已弃用:使用 SubjectPublicKeyInfo.getInstance(...)。而不是getPublicKey() 使用parsePublicKey()
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-04-12
      • 1970-01-01
      • 1970-01-01
      • 2018-08-15
      • 1970-01-01
      • 2010-10-13
      相关资源
      最近更新 更多