Java 如何将PEM公钥转换为DER公钥?
我从我的RESTAPI接收到一个公钥,该公钥用PEM编码。现在,我需要将编码更改为DER,以便将其存储为Java 如何将PEM公钥转换为DER公钥?,java,android,rsa,public-key-encryption,spongycastle,Java,Android,Rsa,Public Key Encryption,Spongycastle,我从我的RESTAPI接收到一个公钥,该公钥用PEM编码。现在,我需要将编码更改为DER,以便将其存储为PublicKey对象。但是,不幸的是,我得到了以下错误: java.lang.IllegalArgumentException:getInstance中的未知对象: org.spongycastle.asn1.asn1整数 错误指向这一行: RSAKeyParameters rsa = (RSAKeyParameters) PublicKeyFactory.createKey(pemRead
PublicKey
对象。但是,不幸的是,我得到了以下错误:
java.lang.IllegalArgumentException:getInstance中的未知对象:
org.spongycastle.asn1.asn1整数
错误指向这一行:
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.");
}
}
Java确实希望看到编码的对象,但您有一个更简单的PKCS#1对象 我知道的最简单的方法是使用bouncycastle PKIX库中的类——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);
你从哪里得到NPE的?在
new-PemReader(new-StringReader(publicKey))代码>语句?您能提供您试图转换的公钥的示例吗?谢谢您的帮助。我收到了NPE,因为我在后端手动从密钥中删除了----BEGIN-RSA公钥---
和----END-RSA公钥---
。现在,我删除了子字符串操作,得到了以下错误:java.lang.IllegalArgumentException:getInstance中的未知对象:org.spongycastle.asn1.ASN1Integer
。