Недостающий ключ шифра

Контекст, используемый для шифрования или дешифрования, сопоставлен с ключом NULL или не сопоставлен с ключом

Описание

Недостающий ключ шифра происходит, когда вы шифруете или дешифруете данные с помощью ключа шифрования NULL или ключа расшифровки.

Примечание

Можно инициализировать контекст шифра с ключом NULL. Однако, прежде чем вы шифруете или дешифруете свои данные, необходимо сопоставить контекст шифра с непустым ключом.

Риск

Шифрование или дешифрование с ключом NULL могут привести к ошибкам времени выполнения или по крайней мере, незащищенный шифрованный текст.

Фиксация

Перед вашими шагами шифрования или дешифрования

 ret = EVP_EncryptUpdate(&ctx, out_buf, &out_len, src, len)
сопоставьте свой контекст шифра ctx с непустым ключом.
ret = EVP_EncryptInit_ex(ctx, EVP_aes_128_cbc(), NULL, key, iv)

Иногда, вы инициализируете свой контекст шифра с непустым ключом

ret = EVP_EncryptInit_ex(&ctx, cipher_algo_1, NULL, key, iv)
но измените алгоритм шифра позже. Когда вы изменяете алгоритм шифра, вы используете ключ NULL.
 ret = EVP_EncryptInit_ex(&ctx, cipher_algo_2, NULL, NULL, NULL)
Второй оператор повторно инициализирует контекст шифра полностью, но с ключом NULL. Чтобы избежать этой проблемы, каждый раз, вы инициализируете контекст шифра с алгоритмом, сопоставляете ее с ключом.

Примеры

развернуть все


#include <openssl/evp.h>
#include <stdlib.h>
#define fatal_error() abort()

unsigned char *out_buf;
int out_len;

int func(EVP_CIPHER_CTX *ctx, unsigned char *iv, unsigned char *src, int len){
    if (iv == NULL)
        fatal_error();
    
    /* Fourth argument is cipher key */
    EVP_EncryptInit_ex(ctx, EVP_aes_128_cbc(), NULL, NULL, iv); 
    
    /* Update step with NULL key */
    return EVP_EncryptUpdate(ctx, out_buf, &out_len, src, len);
}

В этом примере ключ шифра сопоставил с контекстом, ctx является NULL. Когда вы используете этот контекст, чтобы зашифровать ваши данные, можно столкнуться с ошибками времени выполнения.

Исправление — использует случайный ключ шифра

Используйте сильный генератор случайных чисел, чтобы произвести ключ шифра. Исправленный код здесь использует функциональный RAND_bytes, объявленный в openssl/rand.h.


#include <openssl/evp.h>
#include <openssl/rand.h>
#include <stdlib.h>
#define fatal_error() abort()
#define SIZE16 16

unsigned char *out_buf;
int out_len;

int func(EVP_CIPHER_CTX *ctx, unsigned char *iv, unsigned char *src, int len){
    if (iv == NULL)
        fatal_error();
    unsigned char key[SIZE16];
    RAND_bytes(key, 16);
    
    /* Fourth argument is cipher key */
    EVP_EncryptInit_ex(ctx, EVP_aes_128_cbc(), NULL, key, iv); 
    
    /* Update step with non-NULL cipher key */
    return EVP_EncryptUpdate(ctx, out_buf, &out_len, src, len);
}

Информация о результате

Группа: криптография
Язык: C | C++
Значение по умолчанию: 'off'
Синтаксис командной строки: CRYPTO_CIPHER_NO_KEY
Влияние: носитель
ID CWE: 310, 320, 573, 664

Введенный в R2017a