Числа в векторе инициализации (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 слишком короткий, он будет заполнен нулями до достижения правильного размера.