我正在编写一个小程序来生成1024位RSA密钥并加密一些数据。根据{{3}},我使用null out
参数调用它一次,以获得加密输出缓冲区的大小。但是,在我的情况下,它给了我0
。如果我将公钥作为PEM文件写出来,创建一个新的上下文,并通过BIO_read()
将该密钥加载到上下文中,然后我得到一个128
的输出大小,这仍然是我的测试后的错误data是一个非常简单的字符串:"SecretMessage"
。
我在这里做错了什么?为什么我会0
返回outlen
参数?
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);
答案 0 :(得分:1)
显然,您不能将上下文重用于多个操作。你必须为keygen创建一个上下文,然后释放它,然后为加密创建一个新的,然后释放它。 OpenSSL单元测试(特别是enginetest.c
)这样做,这就是我发现它的方法。