1

我正在使用GNU 荨麻库。我有以下代码:

#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?

4

1 回答 1

1

Curve25519将标量的一些位钳制1为或0。特别是在 Curve25519 标量乘法中:

  1. 最低 3 位设置为0,以确保输出点仅在大子组中,并且
  2. 最高位 ( 2^254) 设置为 1,以确保实施者不会跳过任何蒙哥马利阶梯步骤。

在这个钳位操作之后,将执行标量乘法算法。所以在 Curve25519 中,一个点不能与 相乘1


然而,在你的情况下,还有更多的事情发生。nettle 在他们的代码中使用了小端的约定。也就是说,当你执行

one[31] = 1;

您实际上是将位设置为2^248一,而不是2^0位。然后钳位值将变为k = 2^254 + 2^248

计算[2^254 + 2^248] * (9 : 1)结果为0x15e72a76ee8ee090ed290db90290c78d0340ee4755f4786ca502ad32e18433fd(big endian),这与您的观察相对应。

于 2019-10-21T12:25:13.387 回答