无法加载RSA公钥

5
我尝试读取下面显示的RSA公钥,但是在第6行遇到了异常:java.security.spec.InvalidKeySpecException: java.security.InvalidKeyException: IOException: algid解析错误,不是一个序列。
我的代码:
String rsaPublicKey = rsaPublicKeyString.replace(
    "-----BEGIN RSA PUBLIC KEY-----\n", "");
rsaPublicKey = rsaPublicKey.replace("\n-----END RSA PUBLIC KEY-----", "");
byte[] bytes = EncryptionUtils.decodeBase64(rsaPublicKey);

KeyFactory keyFactory = KeyFactory.getInstance("RSA");
X509EncodedKeySpec keySpec = new X509EncodedKeySpec(bytes);
pubKey = (RSAPublicKey)keyFactory.generatePublic(keySpec);

RSA公钥:

-----BEGIN RSA PUBLIC KEY-----
MIIBCgKCAQEAwVACPi9w23mF3tBkdZz+zwrzKOaaQdr01vAbU4E1pvkfj4sqDsm6
lyDONS789sVoD/xCS9Y0hkkC3gtL1tSfTlgCMOOul9lcixlEKzwKENj1Yz/s7daS
an9tqw3bfUV/nqgbhGX81v/+7RFAEd+RwFnK7a+XYl9sluzHRyVVaTTveB2GazTw
Efzk2DWgkBluml8OREmvfraX3bkHZJTKX4EQSjBbbdJ2ZXIsRrYOXfaA+xayEGB+
8hdlLmAjbCVfaigxX0CDqWeR1yFL9kwd9P0NsZRPsmoqVwMbMu7mStFai6aIhc3n
Slv8kg9qv1m6XHVQY3PnEw+QQtqSIXklHwIDAQAB
-----END RSA PUBLIC KEY-----

我在做什么错了吗?

更新:

public static byte[] decodeBase64(String data) throws EncryptionException {
    try {
        BASE64Decoder decoder = new BASE64Decoder();
        return decoder.decodeBuffer(data);
    } catch (Exception e) {
        throw new EncryptionException(e);
    }
}
2个回答

4
对我来说,公钥中缺少了OID。我需要在iOS端进行更正,使用这里的帮助:http://blog.wingsofhermes.org/?p=42 此外,我的公钥不需要强制转换为RSAPublicKey,标准就可以正常工作。
X509EncodedKeySpec pubKeySpec = new X509EncodedKeySpec(publicKeyBytes);
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PublicKey pubKey = keyFactory.generatePublic(pubKeySpec);

2
你的问题是由于你的公钥是一个RSAPublicKey对象而不是一个SubjectPublicKeyInfo对象引起的(有关差异的良好描述,请参见this answer)。在代码可以工作之前,您需要从一个转换为另一个。
BouncyCastle可以为您执行转换。下面的代码段将起作用,尽管我不喜欢它有两个原因:
  1. 它使用了一个已弃用的类PEMReader

  2. 它需要加载BouncyCastle提供程序。

代码:
Security.addProvider(new BouncyCastleProvider());    
PEMReader reader = new PEMReader(new StringReader(rsaPublicKeyString));    
BCRSAPublicKey key = (BCRSAPublicKey) reader.readObject();
bytes[] = key.getEncoded(); // now in SubjectPublicKeyInfo format.

// as before...

使用BouncyCastle,总是有很多种方法解决问题。也许有人能找到比上面那个更优雅的解决方案?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接