Constant block cipher initialization vector

Вектор инициализации является постоянным вместо рандомизированного

Описание

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

Риск

Использование константы IV эквивалентно отказу от использования IV. Ваши зашифрованные данные уязвимы для атак словаря.

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

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

Произведите случайный IV при помощи сильного генератора случайных чисел.

Список генераторов случайных чисел, которые являются криптографически слабыми, см. Vulnerable pseudo-random number generator.

Примеры

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


#include <openssl/evp.h>
#include <stdlib.h>
#define SIZE16 16

/* Using the cryptographic routines */

int func(EVP_CIPHER_CTX *ctx, unsigned char *key){
    unsigned char iv[SIZE16] = {'1', '2', '3', '4','5','6','b','8','9',
                                 '1','2','3','4','5','6','7'};
    return EVP_CipherInit_ex(ctx, EVP_aes_128_cbc(), NULL, key, iv, 1); 
}

В этом примере вектор инициализации iv имеет только постоянные. Вектор постоянной инициализации делает ваш шифр уязвимым для атак словаря.

Коррекция - Используйте вектор случайной инициализации

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


#include <openssl/evp.h>
#include <openssl/rand.h>
#include <stdlib.h>
#define SIZE16 16

/* Using the cryptographic routines */

int func(EVP_CIPHER_CTX *ctx, unsigned char *key){
    unsigned char iv[SIZE16];
    RAND_bytes(iv, 16);
    return EVP_CipherInit_ex(ctx, EVP_aes_128_cbc(), NULL, key, iv, 1); 
}

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

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