API OpenSSL с шифрованием AES с помощью GCM (режим счетчика Галуа) - PullRequest
0 голосов
/ 26 сентября 2018

Я использую 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() даже неопределяется, а не ошибка времени выполнения, как это.)

1 Ответ

0 голосов
/ 27 сентября 2018

Этот режим работы GCM не поддерживается в качестве шифра для шифрования закрытого ключа.С помощью инструмента openssl genpkey версии 1.0.2n для генерации закрытых ключей в формате PKCS # 8 следующая команда отображает то же сообщение об ошибке, с которым вы столкнулись:

$ openssl genpkey -algorithm rsa -aes-128-gcm
..............++++++
.......++++++
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
Error writing key
140736195879880:error:0D0A7072:asn1 encoding routines:PKCS5_pbe2_set_iv:error setting cipher params:p5_pbev2.c:131:
140736195879880:error:2307D00D:PKCS12 routines:PKCS8_encrypt:ASN1 lib:p12_p8e.c:86:

Попытка выполнить то же самое с 1.1.1 выглядит немного чище, но все равно не повезло:

$openssl genpkey -algorithm rsa -aes-128-gcm
genpkey: cipher mode not supported

Для этой версии код инструмента genpkey на уровне основной программы явно тестирует предоставленный шифр здесь дляпроверка на неподдерживаемые режимы:

        if (EVP_CIPHER_mode(cipher) == EVP_CIPH_GCM_MODE ||
            EVP_CIPHER_mode(cipher) == EVP_CIPH_CCM_MODE ||
            EVP_CIPHER_mode(cipher) == EVP_CIPH_XTS_MODE ||
            EVP_CIPHER_mode(cipher) == EVP_CIPH_OCB_MODE) {
            BIO_printf(bio_err, "%s: cipher mode not supported\n", prog);

Действительно, в целях проверки эта команда работает для режима работы CBC:

$ openssl genpkey -algorithm rsa -aes-128-cbc
.................++++++
..........................................................++++++
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
-----BEGIN ENCRYPTED PRIVATE KEY-----
MIICzzBJBgkqhkiG9w0BBQ0wPDAbBgkqhkiG9w0BBQwwDgQI/XYjzz9DQGgCAggA
MB0GCWCGSAFlAwQBAgQQPCvupCCVI57DabGCXHCBbwSCAoCCHMMWy4IHvsdkABw2
<truncated>

Вы писали:

Однако, если бы он не поддерживал режим GCM, я ожидал бы получить ошибку времени компиляции, сообщающую мне, что EVP_aes_256_gcm () даже не определен, а не ошибку времени выполнения, подобную этой.

ItДело не в том, что он не поддерживает режим GCM в целом, но он не поддерживает режим GCM для шифрования закрытого ключа при выполнении PKCS # 8.Это ограничение не может быть известно во время компиляции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...