Это старая версия документа!
Содержание
Как пользоваться gpg: шифрование, расшифровка файлов и сообщений, подпись файлов и проверка подписи, управление ключами.
Часть 5. Расшифровка
Как расшифровать файлы в GPG. Как расшифровать сообщение в GPG
Для расшифровки используется опция -d:
gpg -d test.php.gpg
При этом данные будут выведены прямо в стандартный вывод. То есть в терминал.
Чтобы сохранить данные в файл используйте опцию -o, после которой укажите имя нового расшифрованного файла:
gpg -d -o test.php test.php.gpg
Либо используйте конструкцию вида:
gpg -d ЗАШИФРОВАННЫЙ_ФАЙЛ > РАСШИФРОВАННЫЙ_ФАЙЛ
Также gpg может расшифровывать данные из стандартного ввода. В этом можно убедиться подобной конструкцией:
echo 'Я нашёл клад' | gpg -e -a -r 'Ivan Ivanov' | gpg -d
Более практический пример:
cat test.php.gpg | gpg -d
GPG: Невозможно ввести пароль после неправильной попытки
При симметричном шифровании пароли кэшируются, чтобы не нужно было вводить много раз один и тот же пароль. Можно сильно попасть впросак, если ввести неверный пароль — при последующих попытках открыть этот же файл, система вместо того, чтобы спрашивать у вас новый вариант, будет использовать кэшированную версию, то есть просто будет выдавать ошибку:
gpg: decryption failed: Недопустимый алгоритм симметричного шифрования
Чтобы побороть эту ситуацию, нужно явно указать не использовать кэш, для этого имеется опция --no-symkey-cache, пример использования:
gpg -d --no-symkey-cache test.php.gpg
Как посмотреть получателей зашифрованного в GPG файла
Если вы не хотите расшифровывать файл (а может быть просто не можете из-за отсутствия приватного ключа), но хотите посмотреть, кому он предназначен (это можно сделать даже для зашифрованных файлов, если специально не зашифрованы получатели ), то для этого имеется опция --list-only.
Вместе с этой опцией нужно использовать опцию -d, а также указать проверяемый файл, пример:
gpg --list-only -d test.php.gpg
Может быть выведено:
gpg: зашифровано 2048-битным ключом RSA с идентификатором 0E5137A9EF8E8F15, созданным 2019-02-22
"Ivan Ivanov <@gmail.com>"
Или без локализации:
gpg: encrypted with 2048-bit RSA key, ID 0x0E5137A9EF8E8F15, created 2019-02-22
"Ivan Ivanov <Ivan_Ivanov@gmail.com>"
Это сообщение означает, что выполнено ассиметричное шифрование для пользователя Ivan Ivanov Ivan_Ivanov@gmail.com.
При симметричном шифровании сообщение будет таким:
gpg: сеансовый ключ зашифрован по AES
gpg: зашифровано одной фразой-паролем
gpg: зашифровано 2048-битным ключом RSA с идентификатором 0E5137A9EF8E8F15, созданным 2019-02-22
"Ivan Ivanov <Ivan_Ivanov@gmail.com>"
Или без локализации:
gpg: AES encrypted session key
gpg: encrypted with 1 passphrase
gpg: encrypted with 2048-bit RSA key, ID 0x0E5137A9EF8E8F15, created 2019-02-22
"Ivan Ivanov <Ivan_Ivanov@gmail.com>"
В версиях GPG ранее 2020 года у опции --list-only был баг: если на компьютере, где выполняется проверка, имеется приватный ключ пользователя, кому предназначен данный файл, то не выводиться ничего. Это может запутать, поскольку также ничего не выводиться в случае, если получатель зашифрован.
Чтобы обойти этот баг, используйте опцию -v, получается примерно следующая команда:
gpg --list-only -v -d test.php.gpg
Будет выведено что-то вроде:
gpg: public key is 0x0E5137A9EF8E8F15
И уже по идентификатору публичного ключа можно найти пользователя.
Выбор приватного ключа для расшифровки
Как было сказано, даже зашифрованная информация в GPG содержит имя получателя (если оно специально не удалено). Поэтому процедура расшифровки файлов понятна: GPG смотрит получателя и использует его приватный ключ для извлечения данных.
Если же получатель зашифрован, то GPG просто перебирает все имеющиеся в системе приватные ключи и смотрит, какой из них подойдёт. При этом вы можете помочь программе используя опцию --try-secret-key ИМЯ, где вместо ИМЕНИ нужно указать идентификатор пользователя с закрытым ключом, для которого зашифрован файл.
Зашифрованная информация содержит как минимум такие части как:
- Элемент нумерованного спискаидентификатор получателя,
- Элемент нумерованного списка «полезная нагрузка»
- сами зашифрованные данные.
При этом идентификатор получателя может быть поддельным — то есть для шифрования использовались публичные ключи одного лица, а в качестве получателя указано другое лицо. Это приведёт к тому, что попытка расшифровки в GPG завершиться неудачей.
Для расшифровки таких файлов с поддельным ключевым ID, используется опция --try-all-secrets.
Как можно понять из названия самой опции, она не будет смотреть на ключевой идентификатор в сообщении, а будет пробовать все секретные ключи, пока не найдёт правильный для расшифровки.
То есть поведение будет в точности таким же, как если бы получатель (или получатели) не были указаны вовсе. То есть как если бы данные шифровались с использованием опций --throw-keyids или --hidden-recipient.
