当前位置: 首页 > 知识库问答 >
问题:

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

戚良弼
2023-03-14

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

我遵循的步骤:

>

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

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

    然后,我使用命令查看了相应的公钥

    openssl ec-inprivate.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: ASN1 OID:secp128r1

    我希望从这里生成的公钥中显式地获得x和y分量,请有人建议正确的方法吗
    上述公钥长度为264位,因此无法按原样获取(/split)。
    谢谢

  • 共有2个答案

    高承望
    2023-03-14

    如果有人想在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
      )
    
    谭吉星
    2023-03-14
    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。找到了这个包含更多细节的网站。

     类似资料:
    • 我正在使用openssl库,我想用BIO从. pem文件中读取公钥。我尝试了这个,但我的rsa变量仍然未初始化: 当我调试应用程序时,它向我显示如下内容: 我的文件有效,密钥是按照PKCS#1格式生成的。我用asn1解析器解析了它。

    • 我正在使用Ruby 2.5.x OpenSSL库研究椭圆曲线。我可以很容易地使用 但是给定一个私钥,我想重新生成公钥。 我知道OpenSSL可以做到这一点,因为命令行允许您这样做,Ruby比特币项目也可以做到这一点。但是Ruby比特币项目使用FFI而不是Ruby提供的接口有自己的OpenSSL接口。 Ruby 2.5.x openssl 库是否没有公开足够的 OpenSSL 接口,以便能够从私钥生

    • 问题内容: 我有PEM格式+ PKCS#1(我想)的RSA公钥: 我想在Python中获取其ASN1编码版本的SHA1摘要。第一步应该是读取此密钥,但是我在PyCrypto中无法做到这一点: PyCrypto的文档说支持PEM + PKCS#1,所以我很困惑。我也尝试过M2Crypto,但事实证明M2Crypto不支持PKCS#1,而仅支持X.509。 问题答案: PyCrypto支持 PKCS#

    • 从这里我指出了自己如何获得公钥,并使用EC_POINT_bn2point,而不是hex2point,根据OpenSSL源代码,它在内部执行BN_hex2bn。 那么,为什么EC_POINT_bn2point返回null呢?我正在认真考虑重新编译OpenSSL,并放一些调试例程来找出它失败的原因。

    • 以下命令生成一个包含公钥和私钥的文件: 资料来源:这里 使用OpenSSL,私钥也包含公钥信息,因此公钥不需要单独生成 如何从私钥中提取公钥。pem文件? 谢谢

    • 我使用secp192r1曲线生成了ECC公钥和私钥。公共密钥数组长度为75,私有密钥数组长度125。为什么私钥比公钥长?为什么私钥的长度不是公钥的两倍?为什么由于secp192r1私钥不是192位=24字节?