使用 Crypto++ 的 curve25519 基点乘法

curve25519 base point multiplication using Crypto++

当我们将curve25519的基点乘以一个标量数时,会抛出异常。

Integer gx(group.GetSubgroupGenerator().x);

Integer gy(group.GetSubgroupGenerator().y);

ECP::Point g(gx, gy);

ECP::Point P(group.GetCurve().ScalarMultiply(g, 3));

Exception thrown at 0x005B4412 in CryptoExample.exe: 0xC0000005: Access violation reading location 0x00000000.

除了这条曲线中的基点,我们如何获取生成器?

Integer gx(group.GetSubgroupGenerator().x);

Integer gy(group.GetSubgroupGenerator().y);

ECP::Point g(gx, gy);

ECP::Point P(group.GetCurve().ScalarMultiply(g, 3));

group.GetCurve() 可能返回 NULL 因为没有设置曲线。但是 curve25519 齿轮可能无法使用标准的做事方式(如 Scalar multiplication on secp521r1 using Crypto++ 所示)正确运行。事实上,如果你运行下面的代码:

GroupParameters group;
group.Initialize(ASN1::X25519());

那么代码会出现异常,因为在eccrypto.heccrypto.cpp中缺少域参数:

$ ./test.exe
terminate called after throwing an instance of 'CryptoPP::UnknownOID'
  what():  BER decode error: unknown object identifier

curve25519齿轮在Crypto++中比较特殊。它没有使用库的底层 Integer class 和通过 GroupParameters object 的典型现场操作,而是使用 Andrew Moon 称为 Donna 的恒定时间实现。该库随后包装了 Moon 的 Donna 代码,并使用 Crypto++ objects 提供最预期的操作,如 PK_SignerPK_Verifier.

然而,"... 并提供最预期的操作" 恰好在 lower-level object 处停止,如 DL_GroupParameters_EC,是您尝试使用的界面。

您可能还想看看 donna.h 中可用的函数:

int curve25519_mult (byte publicKey[32], const byte secretKey[32])
    Generate a public key. More...

int curve25519_mult (byte sharedKey[32], const byte secretKey[32], const byte othersKey[32])
    Generate a shared key. More...

这些是您要查找的标量乘法。第一个 curve25519_mult 使用基点 9。第二个 curve25519_mult 允许您指定任意基点。

donna.h 应该是私有的 header,但由于缺少曲线操作,我们不得不公开它。但是,Donna 仍然缺少 AddDouble 的函数,尽管如果需要它们可能会被导出。

另请参阅 Crypto++ wiki 上的 x25519 and ed25519;和 Scalar multiplication on secp521r1 using Crypto++ 在 Stack Overflow 上。


x25519 and ed25519 维基页面实际讨论了您的问题:

The Crypto++ library uses Andrew Moon's constant time ed25519-donna. The curve25519 gear appears to be like most other comparable public key objects in the Crypto++ library but it is mostly a facade. The Crypto++ classes are just wrappers around Moon's code that present some of the expected interface for callers. A side effect of the integration is, there is no general Point, Curve, or GroupParameters so you can't perform arbitrary calculations with curve25519.


curve25519 之所以特别,是因为我们需要提供齿轮,但又想避免为正确支持它而需要进行的大量更改。该库很好地支持短 Weierstrass 曲线,但几乎不支持 Edwards 和 Twisted Edward 曲线。

最终curve25519会被正确添加到库中。