【问题标题】:curve25519 base point multiplication using Crypto++使用 Crypto++ 的curve25519 基点乘法
【发布时间】:2019-08-06 10:45:22
【问题描述】:

当我们将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.

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

【问题讨论】:

  • 我认为你需要澄清你在问什么。您是在问为什么抛出异常/如何避免它?

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


【解决方案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++ 在 Stack Overflow 上。


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

Crypto++ 库使用 Andrew Moon 的恒定时间 ed25519-donna。 curve25519 齿轮似乎与大多数其他可比公众一样 Crypto++ 库中的关键对象,但它主要是一个门面。这 Crypto++ 类只是 Moon 的代码的包装器 调用者的一些预期接口。的一个副作用 积分是,没有通用的点、曲线或组参数 所以你不能用curve25519进行任意计算。


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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多