exponenta event banner

Вектор инициализации постоянного блочного шифра

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

Описание

Этот дефект возникает при использовании константы для вектора инициализации (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++
По умолчанию: Откл.
Синтаксис командной строки: CRYPTO_CIPHER_CONSTANT_IV
Воздействие: среднее
CWE ID: 310, 326, 329
Представлен в R2017a