Пропавшие без вести вектора инициализации блочного шифра

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

Описание

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

Примечание

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

Риск

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

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

Фиксация

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

 ret = EVP_EncryptUpdate(&ctx, out_buf, &out_len, src, len)
сопоставьте свой контекст шифра ctx с непустым вектором инициализации.
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
Влияние: носитель
ID CWE: 310, 326, 329

Введенный в R2017a