从 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
1:RSA 加密 .pem .csr .crt .der .p12文件的区别 base64
1:RSA 加密 .pem .csr .crt .der .p12文件的区别 base64