c++ - 使用 Crypto++ 的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
and中缺少域参数eccrypto.cpp
:
$ ./test.exe
terminate called after throwing an instance of 'CryptoPP::UnknownOID'
what(): BER decode error: unknown object identifier
在 Crypto++ 中,curve25519 齿轮是特殊的。它没有使用库的底层Integer
类和通过GroupParameters
对象的典型字段操作,而是使用来自 Andrew Moon 的称为 Donna 的常量时间实现。然后,该库包装 Moon 的 Donna 代码,并使用 Crypto++ 对象(如PK_Signer
和)提供最预期的操作PK_Verifier
。
但是,“...并提供最预期的操作”恰好停在较低级别的对象上,例如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 仍然缺少 and 的函数Add
,Double
尽管如果需要它们可能会被导出。
还可以在 Crypto++ wiki 上查看x25519
和;在 Stack Overflow上使用 Crypto++ 对 secp521r1 进行标量乘法ed25519
。
和 wiki 页面实际上讨论了您的问题x25519
:ed25519
Crypto++ 库使用 Andrew Moon 的恒定时间 ed25519-donna。curve25519 齿轮看起来像 Crypto++ 库中的大多数其他可比较的公钥对象,但它主要是一个外观。Crypto++ 类只是 Moon 代码的包装器,为调用者提供了一些预期的接口。集成的副作用是,没有通用的点、曲线或组参数,因此您无法使用曲线 25519 执行任意计算。
curve25519 之所以特别,是因为我们需要提供齿轮,但又想避免为了正确支持它而进行大量更改。该库很好地支持短 Weierstrass 曲线,但几乎不支持 Edwards 和 Twisted Edward 曲线。
最终 curve25519 将被正确添加到库中。
推荐阅读
- reactjs - React 功能组件正确使用 Props
- git - 在 copy-webpack-plugin 之后不能在模块外使用 import 语句
- javascript - 如何在 ThreeJS 中为每个点赋予自己的颜色
- python - 写为 f 字符串的正则表达式模式返回与原始字符串不同的结果
- flutter - 从共享首选项中的函数保存本地字符串并在其他页面中使用它
- mysql - 如何从 SQL 中的特定日期获取总透支金额
- python - 自定义 Docker 映像在另一台机器上失败(psycopg2.OperationalError: could not translate host name to address)
- node.js - 如何在 Loopback 4 和 mongoDB 中实现嵌套数组结果及其填充的详细信息
- excel - 无法锻炼 href 类 - 标记
- python - 如何在 plotly 的单个页面中添加两个堆叠区域图?