Predictable block cipher initialization vector

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

Описание

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

Риск

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

Блочные шифры повреждают ваши данные в блоки фиксированного размера. Режимы блочного шифра, такие как 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