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,因为没有设置曲线。但是使用标准的做事方式(如Scalar multiplication on secp521r1 using Crypto++ 所示),curve25519 齿轮可能无法正常工作。其实,如果你运行下面的代码:
GroupParameters group;
group.Initialize(ASN1::X25519());
那么代码会因为eccrypto.h和eccrypto.cpp中缺少域参数而导致异常:
$ ./test.exe
terminate called after throwing an instance of 'CryptoPP::UnknownOID'
what(): BER decode error: unknown object identifier
curve25519 齿轮在 Crypto++ 中是特殊的。它没有使用库的底层Integer 类和通过GroupParameters 对象的典型字段操作,而是使用来自Andrew Moon 的称为Donna 的常量时间实现。然后该库包装 Moon 的 Donna 代码,并使用 PK_Signer 和 PK_Verifier 等 Crypto++ 对象提供最预期的操作。
但是,“...并提供最预期的操作” 恰好停在较低级别的对象上,例如 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 仍然缺少 Add 和 Double 的函数,尽管如果需要它们可能会被导出。
另请参阅 Crypto++ wiki 上的 x25519 和 ed25519;和 Scalar multiplication on secp521r1 using Crypto++ 在 Stack Overflow 上。
x25519 和 ed25519 wiki 页面实际上讨论了您的问题:
Crypto++ 库使用 Andrew Moon 的恒定时间 ed25519-donna。
curve25519 齿轮似乎与大多数其他可比公众一样
Crypto++ 库中的关键对象,但它主要是一个门面。这
Crypto++ 类只是 Moon 的代码的包装器
调用者的一些预期接口。的一个副作用
积分是,没有通用的点、曲线或组参数
所以你不能用curve25519进行任意计算。
curve25519 之所以特殊,是因为我们需要提供齿轮,但又想避免为了正确支持它而进行大量更改。该库很好地支持短 Weierstrass 曲线,但几乎不支持 Edwards 和 Twisted Edward 曲线。
最终 curve25519 将被正确添加到库中。