【发布时间】:2020-01-14 10:58:44
【问题描述】:
我正在尝试使用 DEREncodePrivateKey 将 ECIES num0 PrivateKey 存储到 std::string 并将其重新加载到 num1 PrivateKey 对象中以进行测试。 问题是当密钥在第二个 PrivateKey 对象中使用 BERDecodePrivateKey 加载时,它无法被验证(也测试了未经验证的加密和解密并且没有解密)
这是代码
using namespace CryptoPP;
CryptoPP::AutoSeededRandomPool prng;
ECIES<ECP>::PrivateKey pp;
pp.Initialize(prng, ASN1::secp256k1());
/* returns true*/
bool val=pp.Validate(prng, 3);
std::string saves;
StringSink savesink(saves);
pp.DEREncodePrivateKey(savesink);
/*additional unnecessary steps to make sure the key is written completely */
savesink.MessageEnd();
savesink.Flush(true);
ECIES<ECP>::PrivateKey pro;
StringSource savesSource(saves, true);
pro.BERDecodePrivateKey(savesSource,true,savesSource.MaxRetrievable());
/*here the exception is thrown */
pro.ThrowIfInvalid(prng, 3);
【问题讨论】:
-
看来验证可能只是比较从私钥计算出的公钥与公钥。现在,公钥通常不存在于私钥编码中,因为它很容易计算。所以这确实会使这成为一个非常危险的测试,并且它可能因此而失败。换句话说,您可能只是在加密/解密方面遇到了问题。你能显示你的 DER 编码私钥的 base 64 编码吗?
-
我也想知道
true是否应该在那里,但我也不确定。true可能不是真的... -
@Maarten-reinstateMonica 你认为什么标题适合这篇文章?对于 StringSource 和 BERDecodePrivateKey 中的两个“true”,我已经测试过,如果设置了 false,它们都会抛出异常,对于 StringSource,我已经替换为 ByteQueue 和 StringStore,没有区别,我将给出一个 hex/base64 DER 编码key key 在下一条评论中,但是密钥是用 Crypto++ 本身在同一个源文件中生成的,所以不会有任何问题
-
@Maarten-reinstateMonica 这是一个 hex-DER 编码的私钥 :: 30250201010420DE6C53FED379779A5974E6E67DC10A987EBB6C99AFEBBCA80FEF6E8E213F5EF9 加密工作,如果我使用其他方法导出密钥,解密工作良好只有 DEREncodePrivateKey /BERDecodePrivateKey 失败,感谢您的帮助
-
好的,所以您的 DER 编码密钥包含一个 SEQUENCE,其版本的 INTEGER 值为 1,以及一个仅包含私钥值的 OCTET STRING,请参阅here。它绝对不包含参数或曲线名称或OID,如果我查看代码,
pro也不知道曲线。为什么需要这种特定格式?
标签: c++ cryptography public-key-encryption crypto++ ecies