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> &param = *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。这提供了x25519ed25519。另请参阅 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

PHPMyAdmin 和 ed25519

Docker Cron 未启动:“未知标志:--rm”

Bytomd 助记词恢复密钥体验指南

The Goldilocks Prime