我正在尝试编写一个服务来解密大量openssl加密的内容。它在一个简单的命令行程序中工作得很好,但是当我在Poco(多线程)服务器中使用相同的代码时,我得到:
- 错误:1C 800064:提供程序例程::错误解密 *
OpenSSL 3.0.8 2023年2月7日(库:OpenSSL 3.0.8 2023年2月7日)
我试着将std::strings
复制到C数组中,看看这是否有帮助--没有成功
我不知道我做错了什么。有什么办法能让我成功吗?我看到了使用互斥回调的旧参考,但文档说它们不再需要了。
下面是始终在CLI程序上工作但从未在我的Poco服务中工作的代码:
int decodeAndDecrypt(const char * dataIn,
const unsigned char * key,
const unsigned char * iv,
char * dataOut,
int * outLen,
char * errorMsg)
{
while (ERR_get_error());
BIO * bio = BIO_new_mem_buf((void *)dataIn, -1);
BIO * b64 = BIO_new(BIO_f_base64());
BIO * cipher = BIO_new(BIO_f_cipher());
BIO_set_cipher(cipher, EVP_aes_256_cbc(), key, iv, 0);
BIO_set_flags(b64, BIO_FLAGS_BASE64_NO_NL);
BIO_push(cipher, b64);
BIO_push(b64, bio);
char * outPtr = dataOut;
int max = *outLen;
*outLen = 0;
errorMsg[0] = 0;
while (true)
{
char tmp[1024] = {0};
int bytesRead = BIO_read(cipher, tmp, sizeof(tmp));
if (bytesRead <= 0)
{
break;
}
if (bytesRead > max)
{
snprintf(errorMsg, ERR_SZ, "%s: result data exceeds maximum buffer size.", __func__);
return EXIT_FAILURE;
}
snprintf(outPtr, max, "%s", tmp);
outPtr += bytesRead;
*outLen += bytesRead;
max -= bytesRead;
}
if (*outLen == 0) // If no data was transferred, check for errors
{
unsigned long errNo(0);
bool errorsFound(false);
while ((errNo = ERR_get_error()))
{
errorsFound = true;
array< char, 256 > temp;
ERR_error_string_n(errNo, temp.data(), temp.size());
strcat(errorMsg, temp.data());
}
if (errorsFound)
{
return EXIT_FAILURE;
}
}
BIO_free_all(cipher);
return EXIT_SUCCESS;
}
1条答案
按热度按时间67up9zun1#
我没有意识到EVP_aes_256_cbc()必须具有256位密钥和128位IV。在确保两个值都是正确的长度并为较短的值填充零之后,这个例程开始正常工作。