# Как пользоваться 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 файла Если вы не хотите расшифровывать файл (а может быть просто не можете из-за отсутствия приватного ключа), но хотите посмотреть, кому он предназначен (это можно сделать даже для зашифрованных файлов, если [[01-03-13-03_-_GPG-3_шифрование_файлов_и_сообщений#^14b864|специально не зашифрованы получатели]] ), то для этого имеется опция **--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 . При симметричном шифровании сообщение будет таким: ``` gpg: сеансовый ключ зашифрован по AES gpg: зашифровано одной фразой-паролем gpg: зашифровано 2048-битным ключом RSA с идентификатором 0E5137A9EF8E8F15, созданным 2019-02-22 "Ivan Ivanov " ``` Или без локализации: ``` 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 " ``` > В версиях 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**. [[file_signature_signature_verification|Продолжение]] [[0_content|Оглавление]]