荨麻曲线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 10 的一些标量位。具体在Curve25519标量乘法:

  1. 最低3位设置为0,保证输出点只在大子群中,并且
  2. 最高位 (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(大端),这与您的观察相符。