java - 从十六进制字符串创建 EC 私钥
问题描述
我想知道这是否是从本网站的 HEX 字符串在 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 私钥只是一个数字。如果您打印出您的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 点标记)。
推荐阅读
- javascript - 在laravel中将日期函数传递给javascript
- javascript - DarkSky 代理 - “请求未发送。错误:缺少经度或纬度。” - 节点 JS 请求 URL,不知道为什么不工作
- matlab - 未定义的函数或变量“x”
- ruby-on-rails - 带有 selenium/standalone-chrome 的 dockerized Rails 5 应用程序中 RSpec 系统测试的 SSL 错误
- gis - ST_Polygonize/Shapely 在与共享节点/点重叠时无法多边形化
- swift - 退出函数无意中关闭了两个视图控制器而不是一个
- ios - 如何处理从 ios 应用程序单击返回到 Safari 按钮
- haxe - 在 HashLink 上使用套接字读取 HTTP 请求
- python-3.x - Python 3 中的 Int 对象不可调用错误
- linux - 如何使用一个 ps2pdf 命令将目录中的所有 ps 文件转换为 pdf?