Числа в векторе инициализации (IV) - все нули

У меня возникают проблемы с пониманием следующего предложения: "числа в векторе инициализации (IV) - это все нули (не символ ASCII '0').

Моя цель - использовать команду openssl enc для шифрования файла с использованием aes-128-cbc с ключом K (скажем, 1234567890) и iv, которые отвечают таким требованиям.

До сих пор я пытался не указывать опцию -iv, но затем он говорит "iv undefined", потому что если используется опция -K, необходимо указать опцию -iv. Я пытался использовать -iv 0, но я не уверен, что он правильный.

Для примера я использовал:

openssl enc -aes-128-cbc -e -in input.txt -out output.txt -K 1234567890 -iv 0

Можете ли вы помочь мне проиллюстрировать правильный iv, который отвечает вышеуказанным требованиям?

2 ответа

Решение

Реализация OpenSSL AES-CBC требует, чтобы размер IV был того же размера, что и размер блока - т.е. 128 бит в вашем случае. enc Страница руководства гласит:

-iv IV
    the actual IV to use: this must be represented as a string comprised only of hex digits.

Это не говорит о том, как все 128 битов получаются, если IV, заданный в командной строке, короче - как в вашем примере команды.

К счастью, исходный код OpenSSL доступен. Мы можем видеть в enc.c что IV инициализируется для всех нулей, а затем начальные байты заполняются из аргумента командной строки:

[hiv is the value of the command-line option -iv:]

if ((hiv != NULL) && !set_hex(hiv, iv, sizeof iv)) {
    BIO_printf(bio_err, "invalid hex iv value\n");

[...]

int set_hex(char *in, unsigned char *out, int size)
{
    int i, n;
    unsigned char j;

    n = strlen(in);
    if (n > (size * 2)) {
        BIO_printf(bio_err, "hex string is too long\n");
        return (0);
    }
    memset(out, 0, size);
    for (i = 0; i < n; i++) {
    .......

Таким образом, то, что вы делаете - предоставляя только один ноль для '-iv', - приводит к созданию нуля IV, который вам нужен.

Обратите внимание, что использование константы - и особенно "типичного", такого как все нули - IV, является плохой практикой безопасности; Статья в Википедии объясняет почему.

Для режимов CBC, CFB или OFB необходим вектор инициализации, который по длине равен размеру блока конкретного шифра. Для AES у вас есть 128 бит.

Вы можете проверить свою команду, используя -p, например:

openssl enc -aes-128-cbc -e -in test.txt -out output.txt -K 1234567812346578 -iv 0 -p

Даст вам:

salt=A086E8DE00000000
key=12345678123456781234567812345678
iv =00000000000000000000000000000000

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

Другие вопросы по тегам