Шифрование openssl aes gcm с аутентификацией TAG; командная строка
Я пытаюсь зашифровать файл в режиме AES-GCM с помощью 'openssl' th/ командной строки
openssl enc -aes-256-gcm -p -iv 000000000000000000000000 -K 00000000000000000000000000000000000000000000000000000000000000 -nosalt -in file.raw -out file.enc`
Шифрование работает, но я не смог найти способ получить итоговый тег GCM.Есть ли способ получить это?
В этом документе ( ссылка) я обнаружил "Обратите внимание, что теперь даже можно использовать режим аутентификации, такой как CCM или GCM", но до сих пор нет информации, как это сделать.
Или есть ли какой-нибудь другой стандартный инструмент macos, который мог бы сделать то же самое?
PS: мне интересно делать это с помощью распространенных инструментов командной строки, это не вопрос написания собственной утилиты
3 ответа
Примечание: как указал пользователь dave_thompson_085 ниже, результаты в оставшейся части ответа не относятся к текущим версиям OpenSSL. Я случайно использовал LibreSSL openssl
, Чтение текущей версии документации OpenSSL для enc
инструмент, он содержит следующее предложение
Программа enc не поддерживает аутентифицированные режимы шифрования, такие как CCM и GCM. Утилита не сохраняет и не извлекает тег аутентификации.
Это ответ на ваш вопрос, я полагаю - в зависимости от того, какую версию OpenSSL вы используете.
Оригинальный ответ, полученный с помощью LibreSSL openssl
который поставляется с macOS:
Тег GCM не сохраняется в выходном файле при использовании openssl enc
приложение. Вы можете видеть это из следующей строки:
$ echo -n 'abcdefghijklmnop' | openssl enc -aes-256-gcm -K 0 -iv 0 | hexdump -C
00000000 af c5 23 59 28 06 0c 06 6e 24 ae bf d7 9d f2 68 |..#Y(...n$.....h|
00000010
Размер вывода точно такой же, как и размер ввода, нигде нет байтов тега.
Вы также можете увидеть это, проверив реализацию enc.c. Это не делает никаких EVP_CIPHER_CTX_ctrl()
позвоните, чтобы разобраться с тегом GCM, как объяснено на странице OpenSSL Wiki в разделе Аутентифицированное шифрование и дешифрование EVP. Другими словами, данные тега теряются.
При расшифровке с aes-256-gcm
Сам инструмент также игнорирует отсутствие тега. Сообщение bad decrypt
испускается stderr
но это, кажется, исходит из другого уровня, чем приложение, которое радостно печатает результат:
$ echo -n 'abcdefghijklmnop' | openssl enc -aes-256-gcm -K 0 -iv 0 | openssl enc -aes-256-gcm -K 0 -iv 0 -d
bad decrypt
abcdefghijklmnop
Давно это было опубликовано, но для других:
Когда дело доходит до "общедоступных инструментов командной строки", AES GCM недоступен. Наиболее близким к нему, вероятно, является AESCRYPT, который имеет преимущество в виде документированного формата файла и реализаций на нескольких языках. Подробности см. На сайте aescrypt.com.
Просто из любопытства, как вам удалось заставить работать GCM?
Согласно руководства страницеOpenSSL в ПОДДЕРЖИВАЕМЫХ ШИФРАХ:
Программа enc не поддерживает аутентифицированные режимы шифрования, такие как CCM и GCM, и не будет поддерживать такие режимы в будущем.