C语言 需要OpenSSL 3.0.8库解密帮助

gstyhher  于 2023-05-28  发布在  其他
关注(0)|答案(1)|浏览(163)

我正在尝试编写一个服务来解密大量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;
}
67up9zun

67up9zun1#

我没有意识到EVP_aes_256_cbc()必须具有256位密钥和128位IV。在确保两个值都是正确的长度并为较短的值填充零之后,这个例程开始正常工作。

相关问题