0

我在 base64 中有 ECDSA 私钥字符串(我用这个https://stackoverflow.com/a/8571649/7661555答案中的正则表达式检查了这个字符串)。

我尝试从这个字符串生成 PrivateKey 实例。我在我的项目中包含 SpongyCastle,并尝试使用以下代码生成它:

        PKCS8EncodedKeySpec privKeySpec = new PKCS8EncodedKeySpec(encKey);

        KeyFactory keyFactory = KeyFactory.getInstance("ECDSA", "SC");

        PrivateKey priv = keyFactory.generatePrivate(privKeySpec);

但是当我运行这段代码时,我得到下一个异常:

W/System.err:java.security.spec.InvalidKeySpecException:无法识别编码的密钥规范

你能告诉我我做错了什么吗?

PS 生成 PrivateKey 后,我想用它签署另一个字符串。为此,我找到下一个代码:

        Signature sig = Signature.getInstance("SHA256withECDSA");
        sig.initSign(priv);
        sig.update(token.getBytes());

这是正确的方法吗?或者这其中的某些东西会导致另一个例外?

4

1 回答 1

0

您在问题中提到的正则表达式仅检查字符串是否为 base64 编码。

你能分享一下,你是如何从 EC 私钥生成 base64 字符串的吗?

    private String getBase64Value(PrivateKey privateKey) {
    return Base64.encodeToString(privateKey.getEncoded(), Base64.NO_WRAP);
}

private PrivateKey reconstructPrivateKey(String base64Value) throws InvalidKeySpecException, NoSuchAlgorithmException {
    KeyFactory kf = KeyFactory.getInstance("EC");
    byte[] bytes = Base64.decode(base64Value, Base64.NO_WRAP);
    return kf.generatePrivate(new PKCS8EncodedKeySpec(bytes));
}
于 2017-04-11T03:18:51.440 回答