【问题标题】:Is it necessary to have two coordinates for the public key of ECDSA?ECDSA的公钥是否需要有两个坐标?
【发布时间】:2021-07-05 10:40:08
【问题描述】:

我正在尝试使用名为 easy-ecc 的外部库生成 ECDSA 密钥对。我不明白的是这个库为公钥生成了一个单一的坐标。据我从书籍、在线 ECDSA 生成器或 NIST 测试向量中看到,公钥在曲线上总是有两个坐标(X 和 Y)。例如,如果使用P-384 curve,则私钥的长度将为48字节,公钥将有两个不同的点X和Y,每个48 bytes。所以,总共96 bytes。然而,ecc_make_key 函数的行为与预期不同。

这是创建密钥对的函数原型:

int ecc_make_key(
    uint8_t p_publicKey[ECC_BYTES+1],
    uint8_t p_privateKey[ECC_BYTES]
);

此函数使用按引用传递策略填充空数组。但是,为什么p_publicKey 必须是ECC_BYTES+1 而不是ECC_BYTES*2

【问题讨论】:

  • 大概公钥是以压缩格式指定的。公钥(x,y)可以指定为未压缩格式(0x04|x|y)或压缩格式(b|x,其中b0x02,偶数y0x03,奇数y),参见例如here.

标签: c cryptography ecdsa ecdh


【解决方案1】:

如果你看code;

int ecc_make_key(uint8_t p_publicKey[ECC_BYTES+1], uint8_t p_privateKey[ECC_BYTES])

接受两个参数,一个公钥和一个私钥并初始化它们。

让我们看看最后三行;

    ecc_native2bytes(p_privateKey, l_private);
    ecc_native2bytes(p_publicKey + 1, l_public.x);
    p_publicKey[0] = 2 + (l_public.y[0] & 0x01);
  • 刚刚复制的私钥,只是一个大整数。

  • 仅复制公共点的 x 坐标。这清楚地表明了point compression,并且需要一个指标来仅从x 解析y,因为除了订购两个点外,所有其他点都是负数。

    • 0x04 表示没有压缩,所以公共点完全存储为

      0x04|public_x|public_y

    • 0x02 这表示public_y 是偶数,并且

    • 0x03 这表示public_y 是奇数

      两者都存储为(0x02|0x03)|public_x

我们为什么要压缩

  1. 它需要更少的数据来存储和传输
  2. 它有助于point validation

【讨论】:

    猜你喜欢
    • 2020-07-05
    • 2020-06-08
    • 2022-01-06
    • 2021-08-17
    • 2019-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多