我正在执行RSA签名验证,我将始终收到此错误
terminate called after throwing an instance of 'CryptoPP::BERDecodeErr'
what(): BER decode error
Aborted (core dumped)
我不明白为什么会收到此错误,我以前从未调用过BERDecode。
在我的代码段中,我尝试跟踪它在代码第二行中发生的错误:
FileSource pubFile(publicKey_file.c_str(), true, new HexDecoder);
RSASS<PSSR, SHA1>::Verifier pub(pubFile);
FileSource signatureFile(sig_file.c_str(), true, new HexDecoder);
if (signatureFile.MaxRetrievable() != pub.SignatureLength()) {
return false;
}
SecByteBlock signature(pub.SignatureLength());
signatureFile.Get(signature, signature.size());
bool result = pub.VerifyMessage((const byte*)messages_file.c_str(),
messages_file.length(), signature, signature.size());
return result;
我可以确定出了什么问题,希望能得到一些帮助。谢谢。
最佳答案
您正在尝试加载公共(public)密钥,需要先对其进行解析,然后才能进行任何验证。为此,您将公钥数据提供给ojit_code构造函数。该构造函数尝试解析公共(public)密钥。
现在,公钥通常是编码的数据结构。这些数据结构由称为ASN.1或抽象语法符号1的数据描述语言描述,并使用称为BER(ASN.1的基本编码规则)的方案进行编码。
因此,发生的情况是构造函数尝试读取公共(public)密钥,因此调用Verifier
,从而使输入有意义。不幸的是,输入可能根本不是二进制BER编码的。
因此,要解决此问题,您需要在应用程序中使用其他调用以将其转换为BER或公共(public)密钥对象,或者您需要将密钥转换为BER。如果密钥是ASCII铠装(PEM格式),则可以使用:
$ openssl rsa -pubin -inform PEM -in <filename of key in PEM format> -outform DER -out <filename of key in DER format>
如果这不起作用,请在您的问题中包括公共(public)密钥,以便我们检查为什么它无法解析。
关于c++ - BER解码错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50442596/