【问题标题】:problem with crypto++ ECIES BERDecodePrivateKeycrypto++ ECIES BERDecodePrivateKey 的问题
【发布时间】: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


【解决方案1】:

终于找到问题所在了 正如@maarten-bodewes 在评论中提到的那样,DER 编码的私有指数不能确定 privateKey Object 的曲线 OID,因此在 BER 解码和导入密钥之前,我们需要以某种方式确定对象的 OID; 最简单的方法是在初始化新对象时确定 上面的代码更改为:

ECIES<ECP>::PrivateKey pro;
    StringSource savesSource(saves, true);
    auto rett = savesSource.MaxRetrievable();
    pro.Initialize(prng, ASN1::secp256k1());
    pro.BERDecodePrivateKey(savesSource,true,savesSource.MaxRetrievable());

还有你 AccessGroupParameters().Initialize(/*OID*/);Initialize(/*OID*/) 用于现有对象

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-24
    • 1970-01-01
    • 2019-06-11
    相关资源
    最近更新 更多