2016-04-14 53 views
0

byte []數組以公鑰我得到一個錯誤:錯誤轉換字節數組公鑰的Java

Exception in thread "main" java.security.spec.InvalidKeySpecException: java.security.InvalidKeyException: IOException: short read of DER octet string at sun.security.rsa.RSAKeyFactory.engineGeneratePublic(Unknown Source) at java.security.KeyFactory.generatePublic(Unknown Source)

這是代碼的一部分,讓我這個錯誤:

byte[] publicKeyBytes = keystring.getBytes(); 
KeyFactory keyFactory = KeyFactory.getInstance("RSA"); 
EncodedKeySpec publicKeySpec = new X509EncodedKeySpec(publicKeyBytes); 
PublicKey publicKey2 = keyFactory.generatePublic(publicKeySpec); 

之前檢查過,我從字符串中獲得的byte []數組與原始數組相同。 謝謝

+0

如何獲得'keystring'? 'X590EncodedKeySpec'需要DER格式,你可以通過'publickey.getEncoded()'得到。 –

+0

我得到它通過tcp,所以在「服務器」我從publickey.getEncoded()轉換爲字符串,而不是發送它。在客戶端它是我收到的密鑰串 –

+0

你如何將它從編碼轉換爲'String'?根據字符集的不同,您可能會更改字節。 base64可能是字符串形式的合適字節編碼。 –

回答

0

根據您的意見,您可以使用默認編碼將編碼公鑰的字節直接轉換爲String,肯定會丟棄/替換某些字節。請參閱JavaDoc的new String(bytes[])

所以pair.getPublic().getEncoded()keystring.getBytes()的內容將不會相同。

使用合適的傳輸編碼,如Base64。在Java 8上,您可以使用java.util.Base64,在較早的平臺上可以使用Apache Commons Codec's Base64類。