使用 openssl 获取 ec 公钥的 x 和 y 组件

使用 openssl 获取 ec 公钥的 x 和 y 组件

我正在生成一个密钥对椭圆曲线使用 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

因此,上面的数字(而不是点)是您的私钥。

您还可以使用一些网络工具来提取这些信息。

注意:请不要泄露你的私钥。

相关内容