ECDSA的public键是不是必须要有两个坐标?

Is it necessary to have two coordinates for the public key of ECDSA?

我正在尝试使用名为 easy-ecc 的外部库生成 ECDSA 密钥对。我不明白的是这个库为 public 键生成一个坐标。据我从书籍、在线 ECDSA 生成器或 NIST 测试向量中看到的,public 键在曲线上始终有两个坐标(X 和 Y)。例如,如果使用P-384 curve,则私钥长度为48字节,public密钥将有两个不同的点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

如果你看 code;

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

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

让我们看看最后三行;

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

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

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

      0x04|public_x|public_y

    • 0x02这表示public_y是偶数,而

    • 0x03这表示public_y是奇数

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

为什么要压缩

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