4

以下に示す 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-----

私は何を間違っていますか?

更新:

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

2 に答える 2

3

私にとっては、公開鍵に OID がありませんでした。ここのヘルプを使用して iOS 側で修正する必要がありました: http://blog.wingsofhermes.org/?p=42

また、公開鍵を RSAPublicKey にキャストする必要はありませんでした。標準は問題なく機能しました。

X509EncodedKeySpec pubKeySpec = new X509EncodedKeySpec(publicKeyBytes);
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PublicKey pubKey = keyFactory.generatePublic(pubKeySpec);
于 2014-05-19T23:30:49.527 に答える
1

公開鍵がRSAPublicKeyオブジェクトではなくオブジェクトであるため、問題が発生しSubjectPublicKeyInfoます(違いの詳細については、この回答を参照してください)。コードが機能する前に、一方から他方に変換する必要があります。

BouncyCastle が変換を行います。次のコード スニペットは機能しますが、2 つの理由で気に入りません。

  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 では、猫の皮を剥ぐ方法が常にたくさんあります。おそらく、誰かが上記のものよりもエレガントなソリューションを見つけることができますか?

于 2013-07-24T07:40:56.000 に答える