有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

从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) 个答案

  1. # 1 楼答案

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