2014-10-29 50 views
1

當從openssl ec -pubout ...生成的PEM文件創建java.security.PublicKey時,我得到一個InvalidKeyException: invalid key format。 相同的代碼適用於RSA密鑰。 我在做什麼錯?從openssl以Java創建PublicKey時出現InvalidKeyException

公共密鑰讀取:

-----BEGIN PUBLIC KEY----- 
MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAG0FCGgyhUeJYUXeXoiKOU4GiyTORZ 
U9+OpadxpVWqPbNoSNcfK7Ea13eWOKXlUe22v4Clce3t5nrCEBkwqhhe/g== 
-----END PUBLIC KEY----- 

EC密鑰生成與OpenSSL的:

openssl ecparam -genkey -out private_key.pem -outform PEM -name prime256v1 
openssl pkcs8 -topk8 -inform PEM -outform DER -in private_key.pem -out private_key.der -nocrypt 
openssl ec -in private_key.pem -inform PEM -out public_key.pem -outform PEM -pubout 

(我已經嘗試了不同的設置conv_form和param_enc)

Java代碼:

KeyFactory kf = KeyFactory.getInstance("EC"); 

byte[] privEncoded = ... // read from private_key.der file 
PKCS8EncodedKeySpec privSpec = new PKCS8EncodedKeySpec(privEncoded); 
PrivateKey privKey = kf.generatePrivate(privSpec); 

byte[] pubEncoded = .... // read from public_key.pem file 
X509EncodedKeySpec pubSpec = new X509EncodedKeySpec(pubEncoded); 
PublicKey pubKey = kf.generatePublic(pubSpec); // <-- InvalidKeyException 

編輯:與我上面所說的相反,當用新生成的PEM進行嘗試時,讀取RSA公鑰現在也會失敗。此外,加密然後解密失敗。剝離PEM中的BEGIN和END行,並按照GregS的建議將Base64轉換爲字節,解決了這個問題!

回答

0

Java不支持所謂的「PEM」格式。您必須以openssl的「DER」格式保存數據,或者刪除第一行和最後一行並在Java程序中解碼base64。請參閱javax.xml.bind.DataTypeConverter.parseBase64Binary從base64到字節。

+0

謝謝!現在生成公共密鑰以及加密和解密工作。 – oliverdm 2014-11-03 11:32:47