使用 openssl 获取 ec 公钥的 x 和 y 分量

Dhr*_*wal 13 ecc cryptography openssl

我正在使用 openssl 从曲线“secp128r1”生成ECC的密钥对

我遵循的步骤:

  • 首先我使用命令生成了一个私钥

    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 位长,因此不能按原样使用(/拆分)
谢谢

kel*_*aka 2

首先,secp128r1已经过时了。使用为当今标准提供更好安全性的曲线。请参阅Daniel J. Bernstein 和 Tanja Lange 的safecurves 。

\n

在大小为q的字段上定义的椭圆曲线,每个元素点都有两个坐标XY。椭圆曲线 Secp128r1 有 2 128 -2 97 -1 大小 \xe2\x84\x93,即点数略低于 2^128。这意味着我们需要 128 位表示。

\n

公钥也是曲线上的一个点,有两个坐标,因此,我们需要存储两个128位的。

\n

如果我们看一下椭圆曲线的方程Y 2 = X 3 + aX + b其中

\n
 a = FFFFFFFD FFFFFFFF FFFFFFFF FFFFFF\n b = E87579C1 1079F43D D824993C 2CEE5E\n
Run Code Online (Sandbox Code Playgroud)\n

如果我们从方程中知道X ,我们就可以找到Y。由于我们在一个领域中工作,Y最多可以有两个平方根。Y 2将以y-y作为平方根。这些知识可用于压缩点的表示,称为点压缩。只需x坐标和一位来选择y-y。现在看基点(参见Certicom 推荐

\n
 base point = 03 161FF752 8B899B2D 0C28607C A52C5B86\n            = 04 161FF752 8B899B2D 0C28607C A52C5B86 CF5AC839 5BAFEB13 C02DA292 DDED7A83 \n
Run Code Online (Sandbox Code Playgroud)\n

一个八位位组决定结构

\n
    \n
  • 04意味着没有压缩
  • \n
  • 03表示存在压缩并选择y正值
  • \n
  • 02表示有压缩,选择y负数
  • \n
\n
\n

现在转入OP的参数;

\n
\n
pub:\n04:\n04:ce:24:34:d4:cb:f2:58:94:2f:8a:5f:06:d7:3f:ed: -->X\n5a:50:ef:fb:cc:b7:49:62:16:62:9e:aa:d5:30:a8:a5  -->Y\n
Run Code Online (Sandbox Code Playgroud)\n
\n

第一个八位字节04意味着没有压缩。第一行是公钥的X坐标,第二行是公钥的Y坐标。

\n

那么私钥n呢?它只是一个介于 0<= n <=\xe2\x84\x93之间的标量-整数-

\n
\n

特权:\n00:9f:bf:2b:bd:06:86:3a:a1:bc:7c:3e:90:57:40:f4:bc

\n
\n

因此,上面的数字——而不是点——就是你的私钥。

\n

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

\n\n
\n

注意:请不要暴露您的私钥。

\n
\n