exponenta event banner

Отсутствует ключ шифра

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

Описание

Этот дефект возникает при шифровании или расшифровке данных с использованием ключа шифрования или дешифрования NULL.

Примечание

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

Риск

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

Зафиксировать

Перед выполнением операций шифрования или дешифрования

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

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

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++
По умолчанию: Откл.
Синтаксис командной строки: CRYPTO_CIPHER_NO_KEY
Воздействие: среднее
CWE ID: 310, 320, 573, 664
Представлен в R2017a