当我们将refresh_user_library
的基点乘以标量数字时,将引发异常。
refresh_user_library
除了曲线的基点以外,我们如何获取生成器?
答案 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.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++的堆栈溢出。
Crypto ++库使用Andrew Moon的恒定时间ed25519-donna。 曲线25519齿轮似乎与大多数其他可比较的大众一样 Crypto ++库中的关键对象,但主要是外观。的 Crypto ++类只是Moon的代码的包装 呼叫者的某些预期接口。的副作用 集成是,没有通用的Point,Curve或GroupParameters 因此您无法使用curve25519执行任意计算。
curve25519之所以与众不同,是因为我们需要提供齿轮,但是要避免为正确支撑齿轮而进行大量更改。该库很好地支持短Weierstrass曲线,但几乎不支持Edwards和Twisted Edward曲线。
最终,curve25519将被正确添加到库中。