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格式公钥的正确代码示例:// 先读取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
相关产品推荐
相关产品推荐

