繁体   English   中英

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中读取,构造函数的输入必须是 PKCS8 编码的私钥。 但是, openssl ecparam 命令显然不会生成 PKCS8 格式的密钥。 如果我正确理解文档,您需要将私钥转换为 PKCS8,如下所示:

openssl pkcs8 -topk8 -nocrypt -in ec-secp256k1-dummy-priv-key.pem -out p8file.pem

然后,您可以去除换行符和 BEGIN/END 标记并将其输入 PKCS8EncodedKeySpec。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM