【发布时间】:2018-09-26 18:58:44
【问题描述】:
我在 C++ 中使用 OpenSSL API 来执行私钥的基本加密/解密。我正在尝试不同的加密模式,由于某种原因,在使用 GCM (Galois Counter Mode) 加密和 AES 时出现错误。其他模式(例如 CBC)也可以正常工作。
相关代码(为清楚起见进行了编辑)是:
void encrypt_private_key(
EVP_PKEY* key_handle,
const char* password,
std::size_t password_length
)
{
std::unique_ptr<BIO, decltype(&BIO_free)> bio_ptr(BIO_new(BIO_s_mem()), &BIO_free);
if (!bio_ptr) { /* handle error */ }
const EVP_CIPHER* enc = EVP_aes_256_gcm();
int result = PEM_write_bio_PKCS8PrivateKey(
bio_ptr.get(),
key_handle,
enc,
const_cast<char*>(password),
password_length,
nullptr,
nullptr
);
if (result != 1) { /* handle error code */ }
// ... do stuff with encrypted key
}
在这里,我得到一个错误代码。当我使用ERR_reason_error_string() 打印错误代码时,我收到消息"error setting cipher params"
请注意,如果我将密码从 EVP_aes_256_gcm() 更改为 EVP_aes_256_cbc(),它可以正常工作。
阅读relevant docs,我看到GCM 模式可以使用EVP_CIPHER_CTX_ctrl 函数获取一些额外的参数和调整。但是,AFAIK 这似乎是可选的。除了传递给PEM_write_bio_PKCS8PrivateKey 的参数之外,我没有看到为什么EVP_aes_256_gcm() 不应该在没有设置其他参数的情况下正常工作的原因。
那么我在这里做错了什么?
为什么我在尝试将 GCM 模式与 AES 加密一起使用时会出错?会不会是 OpenSSL 根本没有实现这一点? (我在这里使用的是旧版本的 OpenSSL - OpenSSL 1.0 - 所以这可能是问题所在。但是,如果它不支持 GCM 模式,我希望得到一个编译时错误,告诉我 EVP_aes_256_gcm() 甚至不是定义,而不是像这样的运行时错误。)
【问题讨论】:
标签: c++ encryption openssl