使用 openssl 从 PEM 格式的 ecc 公钥获取 x 和 y 分量

问题描述 投票:0回答:3

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

我遵循的步骤:

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

    openssl ecparam -genkey -name secp128r1 -noout -out private.pem

  • 然后我使用命令查看了对应的公钥

    openssl ec -in private.pem -text -noout

    输出显示为:

    读取 EC 密钥

    私钥:(128 位)
    私人:
    00:9f:bf:2b:bd:06:86:3a:a1:bc:7c:3e:90:57:40:
    f4:bc
    酒吧:
    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 位长,因此不能按原样采用(/拆分)它
谢谢

cryptography openssl public-key-encryption elliptic-curve
3个回答
18
投票
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
  • 0x04
    表示未压缩形式
  • 从剩下的内容来看:
    • X 是上半场
      04:ce:24:34:d4:cb:f2:58:94:2f:8a:5f:06:d7:3f:ed
    • Y 是下半场
      5a:50:ef:fb:cc:b7:49:62:16:62:9e:aa:d5:30:a8:a5

UPD。 找到包含更多详细信息的此网站


1
投票

如果有人想在nodejs中执行此操作,就像我在需要为其他人/应用程序共享公钥(jwk)以验证我的签名时所做的那样...这是从 secp256k1 公共导出 X 和 Y 坐标的快速方法关键:

import base64url from 'base64url';

function getCoordinatesFromSecp256k1PublicKey(uncompressedHexPubKey: string) {
  const publicKeyBuff = Buffer.from(uncompressedHexPubKey, 'hex');
  const pubKeyCoordsBuff = publicKeyBuff.slice(1); // First byte just signals that it is uncompressed. TRASH!
  const halfLen = Buffer.byteLength(pubKeyCoordsBuff) / 2; // should be 32;
  const x = pubKeyCoordsBuff.slice(0, halfLen);
  const y = pubKeyCoordsBuff.slice(halfLen, Buffer.byteLength(pubKeyCoordsBuff) + 1);
  return {
    x: base64url.fromBase64(x.toString('base64')),
    y: base64url.fromBase64(y.toString('base64'))
  };
}

这样你就可以返回你的JWK数据:

const { x, y } = getCoordinatesFromSecp256k1PublicKey(pubKey);

JSON.stringify(
    {
      use: 'sig',
      kid: 'my-keyid',
      alg: 'ECDSA',
      kty: 'EC',
      crv: 'P-256',
      x,
      y,
    },
    null,
    2
  )

0
投票

您介意提出将此代码移植到 python 的建议吗?谢谢!

© www.soinside.com 2019 - 2024. All rights reserved.