exponenta event banner

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

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

Описание

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

Риск

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

Блочные шифры разбивают данные на блоки фиксированного размера. Блочные режимы шифрования, такие как 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++
По умолчанию: Откл.
Синтаксис командной строки: CRYPTO_CIPHER_PREDICTABLE_IV
Воздействие: среднее
CWE ID: 310, 329, 330, 338
Представлен в R2017a