【发布时间】:2018-04-06 19:34:12
【问题描述】:
我正在编写一个小程序来生成 1024 位 RSA 密钥并加密一些数据。根据EVP_PKEY_encrypt() documentation,我使用一个空的out 参数调用它一次,以获取用于加密的输出缓冲区的大小。但是,就我而言,它给了我0。如果我将公钥写成 PEM 文件,创建一个新上下文,然后通过BIO_read() 将该密钥加载到上下文中,那么我得到的输出大小为128,这似乎仍然是错误的,因为我的测试数据非常简单字符串:"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);
【问题讨论】: