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
为什么要压缩
- 它需要更少的数据来存储和传输
- 对point validation
有帮助
我正在尝试使用名为 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
为什么要压缩
- 它需要更少的数据来存储和传输
- 对point validation 有帮助