2013-07-23 198 views
3

我想讀取下面顯示的RSA公鑰,但我在第6行得到一個異常:java.security.spec.InvalidKeySpecException:java.security.InvalidKeyException:IOException:algid解析錯誤,不是順序無法加載RSA公鑰

我的代碼:

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); 
    } 
} 
+0

@DuncanJones完成 – afterwhy

回答

1

你的問題造成的,因爲你的公鑰是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的,總是有很多方法對皮膚一隻貓。也許有人可以找到比上面更優雅的解決方案?

2

對我而言,我錯過了公鑰中的OID。我必須糾正使用幫助從這裏iOS的一面:http://blog.wingsofhermes.org/?p=42

而且,我的公鑰沒有被鑄造成RSAPublicKey,標準的工作就好了:

X509EncodedKeySpec pubKeySpec = new X509EncodedKeySpec(publicKeyBytes); 
KeyFactory keyFactory = KeyFactory.getInstance("RSA"); 
PublicKey pubKey = keyFactory.generatePublic(pubKeySpec);