2

我正在尝试使用名为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

4

1 回答 1

1

如果你看代码

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 坐标。这清楚地表明了点压缩,并且只需要一个指标来解决yfrom,x因为除了顺序两个点之外,所有其他点都是负数。

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

      0x04|public_x|public_y

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

    • 0x03这表明public_y是奇数

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

我们为什么要压缩

  1. 它需要更少的数据来存储和传输
  2. 它有助于点验证
于 2021-07-06T13:44:46.700 回答