Предсказуемый вектор инициализации блочного шифра

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

Описание

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

Риск

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

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

Фиксация

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

  • OS-level PRNG, такой как /dev/random на UNIX® или CryptGenRandom() на Windows®

  • Уровень приложения PRNG, такой как Усовершенствованный стандарт шифрования (AES) в режиме Counter (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
Влияние: носитель
ID CWE: 310, 329, 330, 338

Введенный в R2017a