Я использую OpenSSL API в C ++ для базового шифрования / дешифрования закрытых ключей.Я экспериментировал с различными режимами шифрования, и по какой-то причине я получаю сообщение об ошибке при использовании шифрования 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()
, он будет работать нормально.
Читая соответствующие документы , я вижу, что режим GCM может принимать некоторые дополнительные параметры и настройки с использованием функции EVP_CIPHER_CTX_ctrl
.Тем не менее, AFAIK это кажется необязательным.Я не вижу документированной причины, по которой EVP_aes_256_gcm()
не должен нормально работать без каких-либо дополнительных параметров, кроме того, что передается в PEM_write_bio_PKCS8PrivateKey
.
Так что же я здесь не так делаю?
Почему я получаю сообщение об ошибке при попытке использовать режим GCM с шифрованием AES?Может быть, OpenSSL просто не реализует это?(Я использую более старую версию OpenSSL - OpenSSL 1.0 - так что это может быть проблемой. Однако, если он не поддерживает режим GCM, я ожидаю получить ошибку времени компиляции, сообщающую, что EVP_aes_256_gcm()
даже неопределяется, а не ошибка времени выполнения, как это.)