【问题标题】:EVP_PKEY_encrypt() is giving output size of 0EVP_PKEY_encrypt() 给出的输出大小为 0
【发布时间】:2018-04-06 19:34:12
【问题描述】:

我正在编写一个小程序来生成 1024 位 RSA 密钥并加密一些数据。根据EVP_PKEY_encrypt() documentation,我使用一个空的out 参数调用它一次,以获取用于加密的输出缓冲区的大小。但是,就我而言,它给了我0。如果我将公钥写成 PEM 文件,创建一个新上下文,然后通过BIO_read() 将该密钥加载到上下文中,那么我得到的输出大小为128,这似乎仍然是错误的,因为我的测试数据非常简单字符串:"SecretMessage"

我在这里做错了什么?为什么我得到 0outlen 参数?

   int m_keyBits = 1024;
   int m_padding = RSA_PKCS1_OAEP_PADDING;
   EVP_PKEY* m_key{};
   auto m_context = EVP_PKEY_CTX_new_id(EVP_PKEY_RSA, nullptr);

   if (EVP_PKEY_keygen_init(m_context) <= 0)
   {
      LogFailure();
      return;
   }

   if (EVP_PKEY_CTX_set_rsa_keygen_bits(m_context, m_keyBits) <= 0)
   {
      LogFailure();
      return;
   }

   if (EVP_PKEY_keygen(m_context, &m_key) <= 0)
   {
      LogFailure();
      return;
   }

   std::string const originalData = "SecretMessage";

   std::vector<std::uint8_t> dst;
   std::string const& src = originalData;

   if (EVP_PKEY_encrypt_init(m_context) <= 0)
   {
      LogFailure();
      return;
   }

   if (EVP_PKEY_CTX_set_rsa_padding(m_context, m_padding) <= 0)
   {
      LogFailure();
      return;
   }

   // Invoke encrypt method with NULL output buffer pointer which means OpenSSL will tell us the
   // maximum buffer size.
   std::size_t maxSize;
   if (EVP_PKEY_encrypt(m_context, nullptr, &maxSize,
      reinterpret_cast<unsigned char const*>(&src[0]), src.size()) <= 0)
   {
      LogFailure();
      return;
   }

   dst.resize(maxSize);
   std::size_t writtenSize = maxSize;

   if (EVP_PKEY_encrypt(m_context, reinterpret_cast<unsigned char*>(&dst[0]), &writtenSize,
      reinterpret_cast<unsigned char const*>(&src[0]), src.size()) <= 0)
   {
      LogFailure();
      return;
   }

   dst.resize(writtenSize);

【问题讨论】:

    标签: c++ openssl rsa


    【解决方案1】:

    显然,您不能将上下文重复用于多个操作。您必须为 keygen 创建一个上下文,然后释放它,然后为加密创建一个新上下文,然后释放它。 OpenSSL 单元测试(特别是 enginetest.c)就是这样做的,这就是我发现这一点的方式。

    【讨论】:

      猜你喜欢
      • 2018-07-02
      • 2020-04-11
      • 1970-01-01
      • 2016-03-17
      • 2021-04-13
      • 1970-01-01
      • 2015-08-20
      • 1970-01-01
      • 2021-06-28
      相关资源
      最近更新 更多