使用 Crypto++ 的 curve25519 基点乘法
curve25519 base point multiplication using Crypto++
当我们将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.
除了这条曲线中的基点,我们如何获取生成器?
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
和eccrypto.cpp
中缺少域参数:
$ ./test.exe
terminate called after throwing an instance of 'CryptoPP::UnknownOID'
what(): BER decode error: unknown object identifier
curve25519齿轮在Crypto++中比较特殊。它没有使用库的底层 Integer
class 和通过 GroupParameters
object 的典型现场操作,而是使用 Andrew Moon 称为 Donna 的恒定时间实现。该库随后包装了 Moon 的 Donna 代码,并使用 Crypto++ objects 提供最预期的操作,如 PK_Signer
和 PK_Verifier
.
然而,"... 并提供最预期的操作" 恰好在 lower-level object 处停止,如 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
应该是私有的 header,但由于缺少曲线操作,我们不得不公开它。但是,Donna 仍然缺少 Add
和 Double
的函数,尽管如果需要它们可能会被导出。
另请参阅 Crypto++ wiki 上的 x25519
and ed25519
;和 Scalar multiplication on secp521r1 using Crypto++ 在 Stack Overflow 上。
x25519
and ed25519
维基页面实际讨论了您的问题:
The Crypto++ library uses Andrew Moon's constant time ed25519-donna.
The curve25519 gear appears to be like most other comparable public
key objects in the Crypto++ library but it is mostly a facade. The
Crypto++ classes are just wrappers around Moon's code that present
some of the expected interface for callers. A side effect of the
integration is, there is no general Point, Curve, or GroupParameters
so you can't perform arbitrary calculations with curve25519.
curve25519 之所以特别,是因为我们需要提供齿轮,但又想避免为正确支持它而需要进行的大量更改。该库很好地支持短 Weierstrass 曲线,但几乎不支持 Edwards 和 Twisted Edward 曲线。
最终curve25519会被正确添加到库中。
当我们将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.
除了这条曲线中的基点,我们如何获取生成器?
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
和eccrypto.cpp
中缺少域参数:
$ ./test.exe
terminate called after throwing an instance of 'CryptoPP::UnknownOID'
what(): BER decode error: unknown object identifier
curve25519齿轮在Crypto++中比较特殊。它没有使用库的底层 Integer
class 和通过 GroupParameters
object 的典型现场操作,而是使用 Andrew Moon 称为 Donna 的恒定时间实现。该库随后包装了 Moon 的 Donna 代码,并使用 Crypto++ objects 提供最预期的操作,如 PK_Signer
和 PK_Verifier
.
然而,"... 并提供最预期的操作" 恰好在 lower-level object 处停止,如 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
应该是私有的 header,但由于缺少曲线操作,我们不得不公开它。但是,Donna 仍然缺少 Add
和 Double
的函数,尽管如果需要它们可能会被导出。
另请参阅 Crypto++ wiki 上的 x25519
and ed25519
;和 Scalar multiplication on secp521r1 using Crypto++ 在 Stack Overflow 上。
x25519
and ed25519
维基页面实际讨论了您的问题:
The Crypto++ library uses Andrew Moon's constant time ed25519-donna. The curve25519 gear appears to be like most other comparable public key objects in the Crypto++ library but it is mostly a facade. The Crypto++ classes are just wrappers around Moon's code that present some of the expected interface for callers. A side effect of the integration is, there is no general Point, Curve, or GroupParameters so you can't perform arbitrary calculations with curve25519.
curve25519 之所以特别,是因为我们需要提供齿轮,但又想避免为正确支持它而需要进行的大量更改。该库很好地支持短 Weierstrass 曲线,但几乎不支持 Edwards 和 Twisted Edward 曲线。
最终curve25519会被正确添加到库中。