gpt4 book ai didi

c++ - EVP_PKEY_encrypt() 输出大小为 0

转载 作者:行者123 更新时间:2023-11-30 05:02:46 27 4
gpt4 key购买 nike

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

我在这里做错了什么?为什么我为 outlen 参数返回 0

   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);

最佳答案

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

关于c++ - EVP_PKEY_encrypt() 输出大小为 0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49699887/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com