шифрование openssl aes gcm с тегом аутентификации; командная строка

Я пытаюсь зашифровать файл в режиме AES-GCM с помощью командной строки openssl

openssl enc -aes-256-gcm -p -iv 000000000000000000000000 -K 00000000000000000000000000000000000000000000000000000000000000 -nosalt -in file.raw -out file.enc`

Шифрование работает, но я не смог найти способ получить результирующий тег GCM. Есть ли способ получить его?

В этом документе (ссылка) я нашел "Обратите внимание, что теперь это даже можно использовать режим аутентификации, такой как CCM или GCM », но пока нет информации, как это сделать.

Или есть ли какой-либо другой стандартный инструмент для MacOS, который может выполнять ту же работу?


PS: Мне интересно делать это с помощью широко распространенных инструментов командной строки, это не вопрос написания собственной утилиты.


person user3124812    schedule 25.07.2018    source источник
comment
Последний абзац объясняет, почему этот вопрос не по теме - он не имеет ничего общего с программированием. Попробуйте SuperUser.   -  person Luke Joshua Park    schedule 25.07.2018


Ответы (2)


Примечание: как указал ниже пользователь 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
person Reinier Torenbeek    schedule 25.07.2018
comment
Посмотрите строку 341, и вы увидите, что версия (1.0.2n) вместо этого выдает сообщение об ошибке. Только от версии 1.0.1 до патча g были ошибки - по крайней мере, в апстриме; дистрибутивы могут отличаться. Neardupe stackoverflow.com / questions / 27561605 / См. также github.com/openssl/openssl/issues/471 - person dave_thompson_085; 25.07.2018
comment
Ах, спасибо @ dave_thompson_085 за указание на это. При тестировании я не осознавал, что использую версию LibreSSL 2.3.1. Я обновил свой ответ. - person Reinier Torenbeek; 25.07.2018
comment
Хм ... это управление версиями действительно сбивает с толку. Оказалось, что я посмотрел не на тот документ. Спасибо ребята. - person user3124812; 27.07.2018

Давно это было опубликовано, но для других:

Когда дело доходит до «общедоступных инструментов командной строки», AES GCM недоступен. Наиболее близким к нему, вероятно, является AESCRYPT, который имеет преимущество в виде документированного формата файла и реализаций на нескольких языках. Подробности см. На сайте aescrypt.com.

person Larry    schedule 03.11.2019