从openssl ec在Java中创建公钥时出现加密无效密钥异常
当从由openssl ec -pubout ...
生成的PEM文件创建java.security.PublicKey
时,我得到一个InvalidKeyException: invalid key format
。
同样的代码适用于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公钥时,现在也失败了。此外,加密和解密都会失败。按照GregS的建议,从PEM中剥离开始行和结束行并将Base64转换为字节,解决了这个问题
# 1 楼答案
Java不支持所谓的“PEM”格式。您必须以openssl的“DER”格式保存数据,或者去掉第一行和最后一行,并在Java程序中解码base64。请参见javax.xml.bind.DataTypeConverter.parseBase64Binary将base64转换为字节