Constant block cipher initialization vector

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

Описание

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

Риск

Используя постоянный IV эквивалентно не использованию IV. Ваши зашифрованные данные уязвимы для атак с подбором по словарю.

Блочные шифры повреждают ваши данные в блоки фиксированного размера. Режимы блочного шифра, такие как CBC (Сцепление блоков шифра) защищают от атак с подбором по словарю XOR-лугом каждый блок с зашифрованным выходом от предыдущего блока. Чтобы защитить первый блок, эти режимы используют случайный вектор инициализации (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++
Значение по умолчанию: 'off'
Синтаксис командной строки: CRYPTO_CIPHER_CONSTANT_IV
Удар: носитель
ID CWE: 310, 326, 329

Введенный в R2017a