You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

RSA签名验证时出现CryptoPP::BERDecodeErr错误求助

解决CryptoPP RSA签名验证中的BERDecodeErr错误

看起来你遇到的问题虽然表面上是BERDecodeErr,但本质是公钥数据的格式不符合CryptoPP Verifier的预期——哪怕你没有直接调用BERDecode,RSASS<PSSR, SHA1>::Verifier的构造函数会自动尝试从传入的数据源中解码BER/DER格式的RSA公钥,一旦数据格式不对就会抛出这个错误。

问题根源分析

你的代码第二行RSASS<PSSR, SHA1>::Verifier pub(pubFile);是报错点,这里的pubFile经过HexDecoder解码后,输出的字节流必须是标准ASN.1 BER/DER编码的RSA公钥(没有PEM格式的页眉页脚,也不是其他编码格式)。如果你的公钥文件不符合这个要求,就会触发解码失败。

排查和解决步骤

以下是几个针对性的解决方向:

  • 确认公钥的实际格式

    • 如果你的公钥是PEM格式(带有-----BEGIN PUBLIC KEY-----这类标识):你当前用HexDecoder是错误的,应该先去掉页眉页脚,再用Base64Decoder解码。
    • 如果是Hex编码的公钥:要确保Hex字符串对应的原始字节是完整的DER公钥,没有多余的空格、换行或无效字符。
  • 修正公钥读取的代码
    比如处理PEM格式公钥的正确代码示例:

    // 先读取PEM公钥,去掉页眉页脚后Base64解码
    SecByteBlock pubKeyData;
    FileSource pubFile(publicKey_file.c_str(), true,
        new Base64Decoder(
            new Redirector(pubKeyData)
        )
    );
    // 用解码后的DER数据初始化Verifier
    RSASS<PSSR, SHA1>::Verifier pub(pubKeyData, pubKeyData.size());
    
  • 验证公钥的DER有效性
    可以用OpenSSL命令检查你的公钥(解码后的DER格式)是否合法:

    openssl rsa -inform der -in your_public_key.der -pubin -text
    

    如果命令报错,说明公钥本身格式有问题,需要重新生成或转换为正确的DER格式。

  • 检查Hex解码后的内容
    你可以临时修改代码,把HexDecoder输出的内容保存到文件,再用上述OpenSSL命令验证:

    FileSource pubFile(publicKey_file.c_str(), true,
        new HexDecoder(
            new FileSink("decoded_pubkey.der")
        )
    );
    

    然后检查decoded_pubkey.der是否是合法的DER公钥。

补充说明

CryptoPP的所有公钥/私钥类在初始化时,都会自动执行BER/DER解码操作,所以这个错误和你是否显式调用BERDecode无关——本质是输入的公钥数据不符合ASN.1编码规范。

内容的提问来源于stack exchange,提问作者Lilian

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 07:18:28