JAVA 11 - 椭圆曲线私钥 - 原因:java.security.InvalidKeyException:IOException:版本不匹配:(支持:00,解析:01
JAVA 11 - elliptic curve private key - Caused by: java.security.InvalidKeyException: IOException : version mismatch: (supported: 00, parsed: 01
关于用 Java 获取椭圆曲线私钥的小问题。
我在我的终端中 运行 这个命令:
openssl ecparam -name secp256k1 -genkey -noout -out ec-secp256k1-dummy-priv-key.pem
这个命令工作正常,生成文件很好,我什至可以 cat
文件,我可以看到:
-----BEGIN EC PRIVATE KEY-----
MHQCAQEEIDHE7OA9hgIYW427NieIsXz/qAipMVhqVUIwVcEIWwuAoAcGBSuBBAAK
oUQDQgAEcMu2KlVzJLKQ9XfoWvF0jZ+JwbPeUekHqTYVTFK9ISoKLgBN9abxIxyc
JumqIshcc74GUVtm/sJJoiPJNdEPEQ==
-----END EC PRIVATE KEY-----
(请注意这里写的是 BEGIN EC PRIVATE KEY 而不是 BEGIN PRIVATE KEY)
现在,我开始使用 \n
和空格等,基本上是为了将密钥的“内部”配置为一行字符串。
String s = "MHQCAQEEIDHE7OA9hgIYW427NieIsXz/qAipMVhqVUIwVcEIWwuAoAcGBSuBBAAKoUQDQgAEcMu2KlVzJLKQ9XfoWvF0jZ+JwbPeUekHqTYVTFK9ISoKLgBN9abxIxycJumqIshcc74GUVtm/sJJoiPJNdEPEQ==";
(如果这一步有误,请告诉我)
我试过的:然后我用这段代码来获取私钥
String s = "MHQCAQEEIDHE7OA9hgIYW427NieIsXz/qAipMVhqVUIwVcEIWwuAoAcGBSuBBAAKoUQDQgAEcMu2KlVzJLKQ9XfoWvF0jZ+JwbPeUekHqTYVTFK9ISoKLgBN9abxIxycJumqIshcc74GUVtm/sJJoiPJNdEPEQ==";
byte[] keyData = Base64.getDecoder().decode(s);
EncodedKeySpec privKeySpec = new PKCS8EncodedKeySpec(keyData);
KeyFactory kf = KeyFactory.getInstance("EC");
PrivateKey privKey = kf.generatePrivate(privKeySpec);
不幸的是,它产生了这个错误
SEVERE: null
java.security.spec.InvalidKeySpecException: java.security.InvalidKeyException: IOException : version mismatch: (supported: 00, parsed: 01
Caused by: java.security.InvalidKeyException: IOException : version mismatch: (supported: 00, parsed: 01
at java.base/sun.security.pkcs.PKCS8Key.decode(PKCS8Key.java:350)
at java.base/sun.security.pkcs.PKCS8Key.decode(PKCS8Key.java:355)
我有点难以理解这个问题,以及如何解决这个问题。
如果可能的话,我想避免退回到充气城堡,避免改变生成密钥的方式,避免必须再次将密钥转换为另一种格式。
请问我做错了什么,解决这个问题的正确方法是什么?
谢谢
据我所知,PKCS8EncodedKeySpec Javadocs, the input to the constructor must be a PKCS8 encoded private key. However, the openssl ecparam command 显然不会生成 PKCS8 格式的密钥。如果我对文档的理解正确,您需要像这样将私钥转换为 PKCS8:
openssl pkcs8 -topk8 -nocrypt -in ec-secp256k1-dummy-priv-key.pem -out p8file.pem
然后您可以去除换行符和 BEGIN/END 标签并将其输入 PKCS8EncodedKeySpec。
关于用 Java 获取椭圆曲线私钥的小问题。
我在我的终端中 运行 这个命令:
openssl ecparam -name secp256k1 -genkey -noout -out ec-secp256k1-dummy-priv-key.pem
这个命令工作正常,生成文件很好,我什至可以 cat
文件,我可以看到:
-----BEGIN EC PRIVATE KEY-----
MHQCAQEEIDHE7OA9hgIYW427NieIsXz/qAipMVhqVUIwVcEIWwuAoAcGBSuBBAAK
oUQDQgAEcMu2KlVzJLKQ9XfoWvF0jZ+JwbPeUekHqTYVTFK9ISoKLgBN9abxIxyc
JumqIshcc74GUVtm/sJJoiPJNdEPEQ==
-----END EC PRIVATE KEY-----
(请注意这里写的是 BEGIN EC PRIVATE KEY 而不是 BEGIN PRIVATE KEY)
现在,我开始使用 \n
和空格等,基本上是为了将密钥的“内部”配置为一行字符串。
String s = "MHQCAQEEIDHE7OA9hgIYW427NieIsXz/qAipMVhqVUIwVcEIWwuAoAcGBSuBBAAKoUQDQgAEcMu2KlVzJLKQ9XfoWvF0jZ+JwbPeUekHqTYVTFK9ISoKLgBN9abxIxycJumqIshcc74GUVtm/sJJoiPJNdEPEQ==";
(如果这一步有误,请告诉我)
我试过的:然后我用这段代码来获取私钥
String s = "MHQCAQEEIDHE7OA9hgIYW427NieIsXz/qAipMVhqVUIwVcEIWwuAoAcGBSuBBAAKoUQDQgAEcMu2KlVzJLKQ9XfoWvF0jZ+JwbPeUekHqTYVTFK9ISoKLgBN9abxIxycJumqIshcc74GUVtm/sJJoiPJNdEPEQ==";
byte[] keyData = Base64.getDecoder().decode(s);
EncodedKeySpec privKeySpec = new PKCS8EncodedKeySpec(keyData);
KeyFactory kf = KeyFactory.getInstance("EC");
PrivateKey privKey = kf.generatePrivate(privKeySpec);
不幸的是,它产生了这个错误
SEVERE: null
java.security.spec.InvalidKeySpecException: java.security.InvalidKeyException: IOException : version mismatch: (supported: 00, parsed: 01
Caused by: java.security.InvalidKeyException: IOException : version mismatch: (supported: 00, parsed: 01
at java.base/sun.security.pkcs.PKCS8Key.decode(PKCS8Key.java:350)
at java.base/sun.security.pkcs.PKCS8Key.decode(PKCS8Key.java:355)
我有点难以理解这个问题,以及如何解决这个问题。
如果可能的话,我想避免退回到充气城堡,避免改变生成密钥的方式,避免必须再次将密钥转换为另一种格式。
请问我做错了什么,解决这个问题的正确方法是什么?
谢谢
据我所知,PKCS8EncodedKeySpec Javadocs, the input to the constructor must be a PKCS8 encoded private key. However, the openssl ecparam command 显然不会生成 PKCS8 格式的密钥。如果我对文档的理解正确,您需要像这样将私钥转换为 PKCS8:
openssl pkcs8 -topk8 -nocrypt -in ec-secp256k1-dummy-priv-key.pem -out p8file.pem
然后您可以去除换行符和 BEGIN/END 标签并将其输入 PKCS8EncodedKeySpec。