我正在生成一个密钥对椭圆曲线使用 openssl 从曲线“secp128r1”
我遵循的步骤:
首先我使用命令生成了一个私钥
openssl ecparam -genkey -name secp128r1 -noout -out private.pem
然后我使用命令查看了相应的公钥
openssl ec -in private.pem -text -noout
输出结果如下:
读取 EC 密钥
私钥:(128 位)
priv:
00:9f:bf:2b:bd:06:86:3a:a1:bc:7c:3e:90:57:40:
f4:bc
pub:
04:04:ce:24:34:d4:cb:f2:58:94:2f:8a:5f:06:d7:
3f:ed:5a:50:ef:fb:cc:b7:49:62:16:62:9e:aa:d5:
30:a8:a5
ASN1 OID:secp128r1
我想要从此处生成的公钥中明确获取 x 和 y 分量,请问有人能建议正确的方法吗?
上述公钥长度为 264 位,因此无法按原样获取(/拆分)它
谢谢
答案1
首先,secp128r1已经过时了。使用曲线来为今天的标准提供更好的安全性。参见安全曲线作者:Daniel J. Bernstein 和 Tanja Lange。
在大小为问每个元素点都有两个坐标X和是。椭圆曲线 Secp128r1 的大小为 2 128 -2 97 -1 ℓ,即点数略低于 2^128。这意味着我们需要 128 位表示。
公钥也是曲线上的一个点,有两个坐标,因此需要存储两个128位。
如果我们看一下椭圆曲线的方程是2=X3 + aX+b在哪里
a = FFFFFFFD FFFFFFFF FFFFFFFF FFFFFF
b = E87579C1 1079F43D D824993C 2CEE5E
如果我们知道X从方程中我们可以发现是. 由于我们从事的是是最多可以有两个平方根。是2将会有是或者-y作为平方根。这个知识可以用来压缩一个点的表示,它被称为点压缩。 只是X坐标和一位来选择是或者-y。现在看看基点(见Certicom 推荐)
base point = 03 161FF752 8B899B2D 0C28607C A52C5B86
= 04 161FF752 8B899B2D 0C28607C A52C5B86 CF5AC839 5BAFEB13 C02DA292 DDED7A83
这第一个八位字节决定结构
04
表示没有压缩03
意味着存在压缩并选择是作为积极的02
意味着存在压缩并选择是作为消极的
现在变成OP的参数;
pub: 04: 04:ce:24:34:d4:cb:f2:58:94:2f:8a:5f:06:d7:3f:ed: -->X 5a:50:ef:fb:cc:b7:49:62:16:62:9e:aa:d5:30:a8:a5 -->Y
第一个八位字节04
表示没有压缩。第一行是X坐标,第二行是是你的公钥的坐标。
那么私钥呢n? 它只是一个介于 0<= 之间的标量 - 整数n<=ℓ
私人:00:9f:bf:2b:bd:06:86:3a:a1:bc:7c:3e:90:57:40:f4:bc
因此,上面的数字(而不是点)是您的私钥。
您还可以使用一些网络工具来提取这些信息。
注意:请不要泄露你的私钥。