Predictable block cipher initialization vector

Вектор инициализации генерируется из генератора слабых случайных чисел

Описание

Этот дефект возникает, когда вы используете генератор слабых случайных чисел для вектора инициализации блочного шифра.

Риск

Если вы используете генератор слабых случайных чисел для вектора инициации, ваши данные уязвимы для атак словаря.

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

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

Используйте сильный генератор псевдослучайных чисел (PRNG) для вектора инициализации. Для образца используйте:

  • PRNG уровня ОС, такой как /dev/random в UNIX® или CryptGenRandom() в Windows®

  • PRNG прикладного уровня, такой как Advanced Encryption Standard (AES) в режиме счетчика (CTR), HMAC-SHA1 и т.д.

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

Примеры

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

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

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

В этом примере функция RAND_pseudo_bytes объявлен в openssl/rand.h создает вектор инициализации. Последовательности байтов, которые RAND_pseudo_bytes генерация не обязательно непредсказуема.

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

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


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

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_PREDICTABLE_IV
Влияние: Средний
ИДЕНТИФИКАТОР CWE : 310, 329, 330, 338
Введенный в R2017a