代码之家  ›  专栏  ›  技术社区  ›  PatPanda

JAVA 11-椭圆曲线私钥-原因:JAVA.security.InvalidKeyException:IOException:版本不匹配:(支持:00,解析:01)

  •  0
  • PatPanda  · 技术社区  · 3 年前

    关于用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-----
    

    (请注意这里写的是开始 欧共体 私钥和不开始私钥)

    现在,我骑上了 \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)
    

    我很难理解这个问题,以及如何解决这个问题。

    如果可能的话,我希望避免退回到bouncy castle,避免更改生成密钥的方式,避免再次将密钥转换为另一种格式。

    非常感谢。

    1 回复  |  直到 3 年前
        1
  •  2
  •   D-FENS    3 年前

    据我从报纸上读到的 PKCS8EncodedKeySpec Javadocs ,构造函数的输入必须是PKCS8编码的私钥。但是, openssl ecparam command

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

    然后,您可以剥离换行符和开始/结束标记,并将其输入到PKCS8EncodedKeySpec中。