使用Crypto ++的curve25519基点乘法

时间:2019-08-06 10:45:22

标签: c++ cryptography crypto++ elliptic-curve curve-25519

当我们将refresh_user_library的基点乘以标量数字时,将引发异常。

refresh_user_library

除了曲线的基点以外,我们如何获取生成器?

1 个答案:

答案 0 :(得分:1)

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.heccrypto.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_SignerPK_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仍然缺少AddDouble的函数,尽管如果需要可以将其导出。

另请参阅Crypto ++ Wiki上的x25519ed25519;和Scalar multiplication on secp521r1 using Crypto++的堆栈溢出。


x25519ed25519维基页面实际上讨论了您的问题:

  

Crypto ++库使用Andrew Moon的恒定时间ed25519-donna。   曲线25519齿轮似乎与大多数其他可比较的大众一样   Crypto ++库中的关键对象,但主要是外观。的   Crypto ++类只是Moon的代码的包装   呼叫者的某些预期接口。的副作用   集成是,没有通用的Point,Curve或GroupParameters   因此您无法使用curve25519执行任意计算。


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

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