【问题标题】:Unable to load RSA public key无法加载 RSA 公钥
【发布时间】:2013-07-22 22:54:59
【问题描述】:

我正在尝试读取下面显示的 RSA 公钥,但在第 6 行出现异常:java.security.spec.InvalidKeySpecException: java.security.InvalidKeyException: IOException: algid parse error, not a sequence

我的代码:

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-----

我做错了什么?

UPD:

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

【问题讨论】:

    标签: java rsa public-key


    【解决方案1】:

    对我来说,我缺少公钥中的 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 可以为您进行转换。下面的代码 sn-p 可以工作,虽然我不喜欢它有两个原因:

      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,总有很多方法可以给猫剥皮。也许有人可以找到比上述更优雅的解决方案?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-07-09
        • 1970-01-01
        • 2012-04-14
        • 2011-11-07
        • 2015-05-14
        • 2017-10-07
        • 1970-01-01
        相关资源
        最近更新 更多