从 base64 字符串 ECDSA 私钥创建 PrivateKey

Posted

技术标签:

【中文标题】从 base64 字符串 ECDSA 私钥创建 PrivateKey【英文标题】:Create PrivateKey from base64 string ECDSA private key 【发布时间】:2017-03-05 12:50:53 【问题描述】:

我在 base64 中有 ECDSA 私钥字符串(我用这个 https://***.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:无法识别编码的密钥规范

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

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

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

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

【问题讨论】:

【参考方案1】:

您在问题中提到的正则表达式仅检查字符串是否为 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));

【讨论】:

以上是关于从 base64 字符串 ECDSA 私钥创建 PrivateKey的主要内容,如果未能解决你的问题,请参考以下文章

从 DER 格式的字符串 base64 编码创建 PrivateKey 和 PublicKey

从十六进制字符串创建 EC 私钥

1:RSA 加密 .pem .csr .crt .der .p12文件的区别 base64

1:RSA 加密 .pem .csr .crt .der .p12文件的区别 base64

从 PEM BASE64 编码的私钥文件中获取 RSA 私钥

从私钥派生 ECDSA 公钥