OpenSSL aes-128-cfb не дает ожидаемого размера

Aug 17 2020

Я сам пытаюсь реализовать 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.

Я пропустил здесь что-то важное?

Ответы

2 kelalaka Aug 17 2020 at 22:02

Потому что CFB не требует заполнения, аналогичного режиму работы CTR и OFB. Эти режимы создают блоки шифров, и из них расходуется необходимое количество.

  • В случае openssl enc -K -ivIV не записывается в выходной файл output.txt. Следовательно, он имеет тот же размер, что и открытый текст в байтах; 61байт каждый для моего файла. В этом случае вы должны обработать IV. Поскольку вы также предоставляете IV, убедитесь, что он больше не используется. В противном случае может произойти перетаскивание шпаргалки в режиме CTR или повторном использовании ключа OTP.

  • В случае -k/-kfile/-passIV и 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 предоставляет различные методы получения ключей