【问题标题】:How to convert PEM public key to DER public key?如何将 PEM 公钥转换为 DER 公钥?
【发布时间】:2015-12-16 14:45:04
【问题描述】:

我从我的 REST API 接收到一个以 PEM 编码的公钥。现在,我需要将编码更改为 DER 以便将其存储为 PublicKey 对象。但是,不幸的是,我收到以下错误:

java.lang.IllegalArgumentException:getInstance 中的未知对象: org.spongycastle.asn1.ASN1Integer

而且错误指向这一行:

RSAKeyParameters rsa = (RSAKeyParameters) PublicKeyFactory.createKey(pemReader.readPemObject().getContent());

公钥如下所示:

-----BEGIN RSA PUBLIC KEY-----
MIIBCgKCAQEA04XyJ5K4sQCtqapk98yEAR/ECaVC85JYPsqC09GiZboNdSSxQXj3
UNb53Po8iNX24T4elyjjzqQpVcyi+eaFp9Fggg2ZDyK9Re1wTucs0APDQdsGe1Q5
KImT/SBycI7v1RwSgjQ4I6npMg/0lZY8bnw4Q1AaTIII0KFBHmIYBD1oeCSdVPED
JWQWTSXtStQj83Vyj1uSLEEzXLpVYW4fq8e24tH2D/1j6eIBnBw6YpkWE6T9pZlE
wIs8YoeQWt5+lPWI28PST8VKqXsxH6JVzu5Mj6jLw8WTZxyKvNaGgO4B3J/ze/58
zW0LtlhsKMEq48QdLgPJZ+tfac2EhKANrQIDAQAB
-----END RSA PUBLIC KEY-----

这是我的代码:

public void setPublicKey(String publicKey) {
    try {
        PemReader pemReader = new PemReader(new StringReader(publicKey));
        RSAKeyParameters rsa = (RSAKeyParameters) PublicKeyFactory.createKey(pemReader.readPemObject().getContent());
        pemReader.close();
        RSAPublicKeySpec rsaSpec = new RSAPublicKeySpec(rsa.getModulus(), rsa.getExponent());
        KeyFactory kf = KeyFactory.getInstance("RSA/ECB/PKCS1Padding");
        this.publicKey = kf.generatePublic(rsaSpec);
    } catch (IOException | NoSuchAlgorithmException | InvalidKeySpecException ex) {
        ex.printStackTrace();
        throw new IllegalStateException("Cannot set public key.");
    }
}

【问题讨论】:

  • 您究竟从哪里获得 NPE?在new PemReader(new StringReader(publicKey)); 声明中?您能否提供一个您尝试转换的公钥样本?
  • 感谢您的帮助。好吧,我收到了 NPE,因为我在后端手动从密钥中删除了 -----BEGIN RSA PUBLIC KEY----------END RSA PUBLIC KEY-----。现在,我删除了子字符串操作,我得到了这个错误:java.lang.IllegalArgumentException: unknown object in getInstance: org.spongycastle.asn1.ASN1Integer.

标签: java android rsa public-key-encryption spongycastle


【解决方案1】:

Java 确实希望看到编码的 SubjectPublicKeyInfo 对象,但您有一个更简单的 PKCS#1 RSAPublicKey 对象。

我知道的最简单的方法是使用 bouncycastle PKIX 库中的 PEMParser 类——应该有一个来自 Spongycastle 的等效库。使用此类代替您当前使用的 PemReader 类,如下所示:

        PEMParser pemParser = new PEMParser(new StringReader(publicKey));
        SubjectPublicKeyInfo spki = (SubjectPublicKeyInfo) pemParser.readObject();
        pemParser.close();
        byte [] spkiEncoded = spki.getEncoded();
        X509EncodedKeySpec keySpec = new X509EncodedKeySpec(spkiEncoded);
        
        KeyFactory kf = KeyFactory.getInstance("RSA");
        this.publicKey = kf.generatePublic(keySpec);

【讨论】:

    猜你喜欢
    • 2011-03-10
    • 1970-01-01
    • 1970-01-01
    • 2012-02-23
    • 1970-01-01
    • 1970-01-01
    • 2013-04-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多