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

Posted

技术标签:

【中文标题】从十六进制字符串创建 EC 私钥【英文标题】:Create EC private key from hex string 【发布时间】:2018-08-24 12:18:49 【问题描述】:

我想知道这是否是从本网站的十六进制字符串在 Java 中创建 PrivateKey 对象的正确方法:https://kjur.github.io/jsrsasign/sample/sample-ecdsa.html

从 HEX 字符串创建 BigInteger:

BigInteger priv = new BigInteger(privateKeyFromSite, 16);

并传递给这个方法:

import java.math.BigInteger;
import java.security.KeyFactory;
import java.security.NoSuchAlgorithmException;
import java.security.PrivateKey;
import java.security.spec.InvalidKeySpecException;

import org.bouncycastle.jce.ECNamedCurveTable;
import org.bouncycastle.jce.spec.ECParameterSpec;
import org.bouncycastle.jce.spec.ECPrivateKeySpec;


public static PrivateKey getPrivateKeyFromECBigIntAndCurve(BigInteger s, String curveName) 

    ECParameterSpec ecParameterSpec = ECNamedCurveTable.getParameterSpec(curveName);

    ECPrivateKeySpec privateKeySpec = new ECPrivateKeySpec(s, ecParameterSpec);
    try 
        KeyFactory keyFactory = KeyFactory.getInstance(EC);
        return keyFactory.generatePrivate(privateKeySpec);
     catch (NoSuchAlgorithmException | InvalidKeySpecException e) 
        e.printStackTrace();
        return null;
    

【问题讨论】:

当然,该方法会生成一个 EC 私钥。 【参考方案1】:

是的,没错,EC 私钥只是一个数字。如果您打印出您的PrivateKey,您将看到相应公钥的 X 和 Y 坐标。

例如,假设生成了以下密钥对 (secp256r1):

EC 私钥:1b9cdf53588f99cea61c6482c4549b0316bafde19f76851940d71babaec5e569

EC 公钥:0458ff2cd70c9a0897eb90a7c43d6a656bd76bb8089d52c259db6d9a45bfb37eb9882521c3b1e20a8bae181233b939174ee95e12a47bf62f41a62f1a20381a6f03

我们将私钥字节插入您的函数:

BigInteger priv = new BigInteger("1b9cdf53588f99cea61c6482c4549b0316bafde19f76851940d71babaec5e569", 16);
PrivateKey privateKey = getPrivateKeyFromECBigIntAndCurve(priv, "secp256r1");
System.out.println(privateKey);

然后打印出来:

EC Private Key [91:05:8a:28:94:f9:5c:cb:c4:34:b8:69:e4:39:d4:57:59:c7:51:35]
        X: 58ff2cd70c9a0897eb90a7c43d6a656bd76bb8089d52c259db6d9a45bfb37eb9
        Y: 882521c3b1e20a8bae181233b939174ee95e12a47bf62f41a62f1a20381a6f03

如您所见,如果您连接04 + X + Y,您将获得原始的公钥,(04 是未压缩的 EC 点标记)。

【讨论】:

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

EC 将字符串转换为 PublicKey / PrivateKey

在给定曲线和私有指数的情况下创建 ECDSA 私钥?

使用 Terraform 代码创建 Ec2 实例,其中私钥将存储在 AWS 参数存储中(类型-安全字符串)

从 ECDSA 公钥生成比特币地址

试图从 c# 字符串转换为 SQL 二进制文件

为什么以太网密钥库密文 以十六进制字符串格式存储,长度仅为64?