OpenSSL aes-128-cfb не дает ожидаемого размера
Я сам пытаюсь реализовать aes-128-cfb для обучения. Чтобы убедиться, что моя реализация верна, я хочу проверить ее с помощью известной библиотеки, такой как OpenSSL. Но потом я заметил кое-что странное, когда попытался использовать OpenSSL для шифрования.
У меня есть файл cleartext.txt
следующего содержания:
This is cleartext that will be used to encrypt with OpenSSL.
Затем я выполняю эту команду
openssl enc -aes-128-cfb -in cleartext.txt -K 48656c6c6f20576f726c642041455321 -iv 72616e646f6d20313662797465206976 -out output.txt
Странно то, что выходной файл содержит всего 60 байт. Блок AES составляет 16 байт. Ожидаемый размер вывода в байтах должен быть кратен 16. 60 не кратно 16.
Я пропустил здесь что-то важное?
Ответы
Потому что CFB не требует заполнения, аналогичного режиму работы CTR и OFB. Эти режимы создают блоки шифров, и из них расходуется необходимое количество.
В случае
openssl enc -K -iv
IV не записывается в выходной файлoutput.txt
. Следовательно, он имеет тот же размер, что и открытый текст в байтах;61
байт каждый для моего файла. В этом случае вы должны обработать IV. Поскольку вы также предоставляете IV, убедитесь, что он больше не используется. В противном случае может произойти перетаскивание шпаргалки в режиме CTR или повторном использовании ключа OTP.В случае
-k/-kfile/-pass
IV и Key извлекаются из метода получения ключа с использованием пароля пользователя и 8-байтовой случайной соли.OpenSSL первый пишет магический файл из
Salted__
затем 8 байт соли затем зашифрованный в файл. Теперь выходной размер - вашmagic size + salt size + data-size
. В моей системе8+8+61 = 77
байты.Если используется режим ECB
openssl enc -aes-128-ecb -in cleartext.txt -k -pass -out output.txt
тогда размер равен
80
байтам из-за заполнения. Конечно, ЕЦБ не использует IV и об этом режиме следует забыть!Режим CBC дает аналогичные результаты с ECB.
Полученный размер IV может изменяться в соответствии с используемым алгоритмом шифрования, таким как 8-байтовый блочный шифр TDES, а для Blowfish требуется 8-байтовый IV, а для 16-байтовых блочных шифров, таких как AES, и Twofish требуется 16-байтовый IV.
При использовании пароля можно быть осторожным с энтропией пароля и используемым методом получения ключа. Рекомендуется использовать пароль Diceware и не менее PBKDF2 для получения ключа. OpenSSL предоставляет различные методы получения ключей