我一直在尝试使用来自debian实验的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
透过互联网看来,曲线448是最后一个版本。我该如何解决这个问题?
答案 0 :(得分:2)
我一直在尝试生成Ed448 ECDSA密钥......看起来曲线448是在最后一个版本中实现的。
我们前段时间为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这样的库。