Crypto++ Ed448 未知 oid
Posted
技术标签:
【中文标题】Crypto++ Ed448 未知 oid【英文标题】:Crypto++ Ed448 unknown oid 【发布时间】:2018-05-18 09:24:26 【问题描述】:我一直在尝试使用来自 debian Experiment 的 crypto++ 7 生成 Ed448 ECDSA 密钥。我的代码如下:
AutoSeededRandomPool rng;
ECIES<ECP>::Decryptor d(rng, ASN1::curve448());
我可以毫无错误地编译这段代码,但是当它运行时,我得到以下异常:
terminate called after throwing an instance of 'CryptoPP::UnknownOID'
what(): BER decode error: unknown object identifier
通过互联网查看,curve448 似乎是在上一个版本中实现的。我该如何解决这个问题?
【问题讨论】:
【参考方案1】:我一直在尝试生成 Ed448 ECDSA 密钥...看来curve448 是在上一个版本中实现的。
我们前段时间为 25519 和 448 曲线添加了 OID。添加它们是为了简化curve25519 和ed25519 的测试。您可以在 oids.h
上查看 OID。
它们的 OID 于 2016 年 4 月 11 日在 Commit 7ca5f7d3b53f 添加,随后在同一天在 Commit 29e9bd2b27a9 修复。 2016 年 4 月 11 日,它们可用于 Crypto++ 5.6.4。
我可以无错误地编译这段代码,但是当它运行时,我得到以下异常
您遇到异常是因为eccrypto.cpp
中没有curve448 的域参数。您遇到以下异常是因为it == end
。
template <class EC> void DL_GroupParameters_EC<EC>::Initialize(const OID &oid)
const EcRecommendedParameters<EllipticCurve> *begin, *end;
GetRecommendedParameters(begin, end);
const EcRecommendedParameters<EllipticCurve> *it = std::lower_bound(begin, end, oid, OIDLessThan());
if (it == end || it->oid != oid)
throw UnknownOID();
const EcRecommendedParameters<EllipticCurve> ¶m = *it;
m_oid = oid;
...
这是背后的故事......
根据curve25519的A state-of-the-art Diffie-Hellman function,曲线的源代码在SUPERCOP。 SUPERCOP 是加密算法的基准测试程序。
我们在测试分支上有curve25519 和ed25519。我们从 SUPERCOP 中删除了实现。 SUPERCOP 具有curve25519、curve448 和许多其他东西的优化参考实现。添加curve25519和ed25519后,我们计划在curve448上。
我们基于 Andrew Moon 的实现添加了 curve25519。这提供了x25519
和ed25519
。另请参阅 Issue 761 (x25519) 和 Issue 764 (ed25519)。
此时,curve448 的 Crypto++ 实现已停止。我认为您的选择是基于 SUPERCOP 自行推出,或者使用像 libsodium
、Botan 或 OpenSSL 这样的库。
【讨论】:
我几天前改用了botan。它没有 448,但它有 25519。一旦 crypto++ 支持它,我将再次尝试连接它。感谢您的帮助! 没问题@Cyclic。我相信 Jack Lloyd 使用了 Adam Langley 的curve25519-donna
。杰克对博坦非常细心。您可以考虑在Botan GitHub 向curve448 提出功能请求。不幸的是,在我们可以安全地移除 UB 并获得团队批准之前,我们将陷入停滞。以上是关于Crypto++ Ed448 未知 oid的主要内容,如果未能解决你的问题,请参考以下文章
PHPMailer 生成 PHP 警告:stream_socket_enable_crypto(): Peer certificate does not match expected