使用openssl从ECC公钥的PEM格式中获取x和y组件。

10
我正在使用openssl从曲线'secp128r1'生成ECC的密钥对。
我遵循的步骤是:
  • 首先使用以下命令生成私钥:

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

  • 然后使用以下命令查看相应的公钥:

    openssl ec -in private.pem -text -noout

    输出如下:

    read EC key

    Private-Key: (128 bit)
    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
Stack Overflow是一个处理编程和开发问题的网站。这个问题似乎不属于编程或开发的范畴。请参见帮助中心中的我可以在这里提什么样的问题。也许Suoer User信息安全 Stack ExchangeUnix & Linux Stack Exchange更适合提问。 - jww
谢谢,我一定会把这个放那儿的。 - Dhruv Agarwal
2个回答

17
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

更新。 发现这个网站包含更多细节。


1
谢谢。这很不错。 - Dhruv Agarwal
1
谢谢,这正是我想要的。 - Thomas Liao

1

如果有人想在Node.js中执行此操作,就像我需要共享公钥(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
  )

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接