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.h
and中缺少域参数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 的函数Add
,Double
尽管如果需要它们可能会被导出。
还可以在 Crypto++ wiki 上查看x25519
和;在 Stack Overflow上使用 Crypto++ 对 secp521r1 进行标量乘法ed25519
。
和 wiki 页面实际上讨论了您的问题x25519
:ed25519
Crypto++ 库使用 Andrew Moon 的恒定时间 ed25519-donna。curve25519 齿轮看起来像 Crypto++ 库中的大多数其他可比较的公钥对象,但它主要是一个外观。Crypto++ 类只是 Moon 代码的包装器,为调用者提供了一些预期的接口。集成的副作用是,没有通用的点、曲线或组参数,因此您无法使用曲线 25519 执行任意计算。
curve25519 之所以特别,是因为我们需要提供齿轮,但又想避免为了正确支持它而进行大量更改。该库很好地支持短 Weierstrass 曲线,但几乎不支持 Edwards 和 Twisted Edward 曲线。
最终 curve25519 将被正确添加到库中。