从openssl ec在Java中创建PublicKey时出现InvalidKeyException

时间:2014-10-29 12:38:23

标签: java cryptography openssl elliptic-curve

InvalidKeyException: invalid key format生成的PEM文件创建java.security.PublicKey时,我得到openssl ec -pubout ...。 相同的代码适用于RSA密钥。 我做错了什么?

公钥如下:

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

使用OpenSSL生成EC密钥:

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公钥现在也失败了。此外,加密然后解密失败。从GEM中剥离BEGIN和END行,并将G64S建议的Base64转换为字节,解决了它!

1 个答案:

答案 0 :(得分:0)

Java不支持所谓的“PEM”格式。您必须以openssl的“DER”格式保存数据,或者删除第一行和最后一行并解码Java程序中的base64。请参阅javax.xml.bind.DataTypeConverter.parseBase64Binary以从base64转到字节。