荨麻曲线25519基点结果*1
nettle curve 25519 result of base point * 1
我正在使用 GNU nettle 库。我有以下代码:
#include <nettle/curve25519.h>
uint8_t result[32], one[32];
for(auto &i : one) i = 0;
one[31] = 1;
curve25519_mul_g(result, one);
在代码中,我将1乘以基点。基点的 x 坐标是 9,所以我希望结果是 9。
但是,它给了我这个数字:
0xfd3384e132ad02a56c78f45547ee40038dc79002b90d29ed90e08eee762ae715
.
为什么这段代码没有生成9?
Curve25519 clamps 1
或 0
的一些标量位。具体在Curve25519标量乘法:
- 最低3位设置为
0
,保证输出点只在大子群中,并且
- 最高位 (
2^254
) 设置为 1,以确保实施者不会跳过任何蒙哥马利阶梯步骤。
在此钳位操作之后,将执行标量乘法算法。所以在Curve25519中,一个点不能乘以1
.
但是,在您的情况下,还有更多的事情要做。 nettle 在他们的代码中使用小端约定。也就是说,当你执行
one[31] = 1;
您实际上是将 2^248
位设置为 1, 而不是 2^0
位。那么clamped值就会变成k = 2^254 + 2^248
.
计算 [2^254 + 2^248] * (9 : 1)
结果为 0x15e72a76ee8ee090ed290db90290c78d0340ee4755f4786ca502ad32e18433fd
(大端),这与您的观察相符。
我正在使用 GNU nettle 库。我有以下代码:
#include <nettle/curve25519.h>
uint8_t result[32], one[32];
for(auto &i : one) i = 0;
one[31] = 1;
curve25519_mul_g(result, one);
在代码中,我将1乘以基点。基点的 x 坐标是 9,所以我希望结果是 9。
但是,它给了我这个数字:
0xfd3384e132ad02a56c78f45547ee40038dc79002b90d29ed90e08eee762ae715
.
为什么这段代码没有生成9?
Curve25519 clamps 1
或 0
的一些标量位。具体在Curve25519标量乘法:
- 最低3位设置为
0
,保证输出点只在大子群中,并且 - 最高位 (
2^254
) 设置为 1,以确保实施者不会跳过任何蒙哥马利阶梯步骤。
在此钳位操作之后,将执行标量乘法算法。所以在Curve25519中,一个点不能乘以1
.
但是,在您的情况下,还有更多的事情要做。 nettle 在他们的代码中使用小端约定。也就是说,当你执行
one[31] = 1;
您实际上是将 2^248
位设置为 1, 而不是 2^0
位。那么clamped值就会变成k = 2^254 + 2^248
.
计算 [2^254 + 2^248] * (9 : 1)
结果为 0x15e72a76ee8ee090ed290db90290c78d0340ee4755f4786ca502ad32e18433fd
(大端),这与您的观察相符。