【发布时间】: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