1

当我们将 的基点乘以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.

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

4

1 回答 1

2
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.hand中缺少域参数eccrypto.cpp

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

在 Crypto++ 中,curve25519 齿轮是特殊的。它没有使用库的底层Integer类和通过GroupParameters对象的典型字段操作,而是使用来自 Andrew Moon 的称为 Donna 的常量时间实现。然后,该库包装 Moon 的 Donna 代码,并使用 Crypto++ 对象(如PK_Signer和)提供最预期的操作PK_Verifier

但是,“...并提供最预期的操作”恰好停在较低级别的对象上,例如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应该是私有标头,但由于缺少曲线操作,我们不得不公开它。但是,Donna 仍然缺少 and 的函数AddDouble尽管如果需要它们可能会被导出。

还可以在 Crypto++ wiki 上查看x25519和;在 Stack Overflow上使用 Crypto++ 对 secp521r1 进行标量乘法ed25519


和 wiki 页面实际上讨论了您的问题x25519ed25519

Crypto++ 库使用 Andrew Moon 的恒定时间 ed25519-donna。curve25519 齿轮看起来像 Crypto++ 库中的大多数其他可比较的公钥对象,但它主要是一个外观。Crypto++ 类只是 Moon 代码的包装器,为调用者提供了一些预期的接口。集成的副作用是,没有通用的点、曲线或组参数,因此您无法使用曲线 25519 执行任意计算。


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

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

于 2019-08-06T14:04:57.043 回答