Missing block cipher initialization vector

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

Описание

Этот дефект возникает, когда вы шифруете или расшифровываете данные с помощью вектора инициализации NULL (IV).

Примечание

Можно инициализировать контекст шифра с помощью вектора инициализации NULL (IV). Однако, если ваш алгоритм требует IV, перед шагом шифрования или расшифровки необходимо связать контекст шифра с не-NULL IV.

Риск

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

Блочные шифры разбивают ваши данные на блоки фиксированного размера. Режимы блочного шифрования, такие как CBC (Cipher Block Chaining), защищают от атак словаря XOR-ing каждый блок с зашифрованным выходом из предыдущего блока. Чтобы защитить первый блок, эти режимы используют вектор случайной инициализации (IV). Если вы используете NULL IV, то получаете тот же шифротекст при шифровании того же открытого текста. Ваши данные становятся уязвимыми для атак словаря.

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

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

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

Примеры

расширить все


#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 *key, unsigned char *src, int len){
    if (key == NULL)
        fatal_error();
    
    /* Last argument is initialization vector */
    EVP_EncryptInit_ex(ctx, EVP_aes_128_cbc(), NULL, key, NULL); 
    
    /* Update step with NULL initialization vector */
    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 *key, unsigned char *src, int len){
    if (key == NULL)
        fatal_error();
    unsigned char iv[SIZE16];
    RAND_bytes(iv, 16);
    
    /* Last argument is initialization vector */
    EVP_EncryptInit_ex(ctx, EVP_aes_128_cbc(), NULL, key, iv); 
    
    /* Update step with non-NULL initialization vector */
    return EVP_EncryptUpdate(ctx, out_buf, &out_len, src, len);
}

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

Группа: Криптография
Язык: C | C++
По умолчанию: Off
Синтаксис командной строки: CRYPTO_CIPHER_NO_IV
Влияние: Средний
ИДЕНТИФИКАТОР CWE : 310, 326, 329
Введенный в R2017a