C++ OpenSSL EVP_DigestVerify 间歇性失败 rsa_pk1.c:103 RSA_R_BAD_PAD_BYTE_COUNT

C++ OpenSSL EVP_DigestVerify intermittently failing rsa_pk1.c:103 with RSA_R_BAD_PAD_BYTE_COUNT

我已经包含了 a full, basic code example 可以使用以下命令编译(安装了 boost)"g++ -std=c++11 -g test.cpp -lssl -lcrypto -lboost_system"

我的代码非常接近 OpenSSL EVP 签名和验证 Asymmetric example,并针对内存管理进行了一些 Boost 重构。

但是,它的行为非常断断续续,并且随着不同的键和不同的文本而变化。我很确定我在这里遗漏了一些东西,但由于时间压力,我将对 openssl 实用程序进行安全系统调用,我没有遇到任何问题。

下面的测试输出说明了这个问题。 "A" 和 "AAA" 已成功签名和验证,而 "AA" 失败并出现 RSA_R_BAD_PAD_BYTE_COUNT 填充错误。为了尝试更正此问题,我将填充设置为 PKCS,但没有任何区别。

2048 bit [2] -  Text: A - Success
Authentication failure: 67567722, rsa_pk1.c, 103, , 0 257
Error string: error:0407006A:lib(4):func(112):reason(106)
2048 bit [2] -  Text: AA - Failure
2048 bit [2] -  Text: AAA - Success

如有指点,将不胜感激!

问题与您在 testSignVerify 中将 char* 转换为 string 的方式有关:

string hashString((char*)pHash.get());

应该是:

string hashString(pHash.get(), hashLength);

这是因为默认的字符串构造函数会在它遇到第一个 '[=15=]' 时停止,这对于普通字符串来说是可以的,但对于加密哈希来说,它只是可能的字符之一。