gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 14:26:13 25 4
gpt4 key购买 nike

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

公钥内容如下:

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

使用 OpenSSL 生成 EC key :

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 中删除 BEGIN 和 END 行并将 Base64 转换为字节,解决了这个问题!

最佳答案

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

关于java - 从 openssl ec 在 Java 中创建 PublicKey 时出现 InvalidKeyException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26630570/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com