GNU_privacy_guard/README.md

18 KiB
Raw Blame History

GNU_privacy_guard

Установка:

Ubuntu/Debian:

sudo apt update && sudo apt install gnupg

Принудительное переключение в режим консоли:

nano ~/.gnupg/gpg-agent.conf
pinentry-program /usr/bin/pinentry-tty
Зачем это надо? Обычно GPG выдает графическое окно для ввода парольной фразы — всплывающее окошко pinentry-gtk или pinentry-qt. При работе с удалёнными серверами по SSH или в чисто консольной среде (без графической оболочки) такое окно не может отобразиться, и команда просто зависает. Переключаться туда-сюда между графическим окошком и терминалом тоже неудобно, особенно если вы работаете в консоли постоянно. Поэтому имеет смысл принудительно переключить GPG в консольный режим с помощью pinentry-tty, чтобы пароль запрашивался прямо в терминале.

Создание пары ключей:

gpg --full-generate-key
Как работает ассиметричное шифрование? Асимметричное шифрование — это метод шифрования данных, предполагающий использование двух ключей — открытого и закрытого. Открытый (публичный) ключ применяется для шифрования информации и может передаваться по незащищенным каналам. Закрытый (приватный) ключ применяется для расшифровки данных, зашифрованных открытым ключом. Открытый и закрытый ключи — это очень большие числа, связанные друг с другом определенной функцией, но так, что, зная одно, крайне сложно вычислить второе. ## Принцип действия ассиметричного шифрования - Субъект А генерирует пару ключей, открытый и закрытый (публичный и приватный). - Субъект А передает открытый ключ субъекту Б. Передача может осуществляться по незащищенным каналам. - Субъект Б шифрует пакет данных при помощи полученного открытого ключа и передает его А. Передача может осуществляться по незащищенным каналам. - Субъект А расшифровывает полученную от Б информацию при помощи секретного, закрытого ключа.

В такой схеме перехват любых данных, передаваемых по незащищенным каналам, не имеет смысла, поскольку восстановить исходную информацию возможно только при помощи закрытого ключа, известного лишь получателю и не требующего передачи. Подробнее почитать об ассиметричном шифровании можно, например, здесь: https://encyclopedia.kaspersky.ru/glossary/asymmetric-encryption/

Параметры генерации:

Please select what kind of key:
   (1) RSA and RSA (default)
   (2) DSA and Elgamal
   (3) DSA (sign only)
   (4) RSA (sign only)
   (9) ECC (sign and encrypt) *default*
  (10) ECC (sign only)
  (14) Existing key from card

RSA keys may be between 1024 and 4096 bits.
What keysize do you want? (3072) 4096

Key is valid for? (0) 2y

далее, если выбрать RSA, будет предложено ввести длину ключа, после этого - срок действия ключа. Можно выбрать любой срок, включая неограниченный (0).

Real name: Иван Петров
Email address: ivan@example.com
Comment: work key

Парольная фраза:

┌─────────────────────────────────────────────────────────┐
│ Please enter the passphrase to protect your new key     │
│                                                         │
│ Passphrase: ************************************        │
│ Repeat:     ************************************        │
└─────────────────────────────────────────────────────────┘

Парольная фраза защищает приватный ключ. Её потеря - потеря ключа.

Просмотр ключей:

Список публичных ключей:

gpg --list-keys

Список приватных ключей:

gpg --list-secret-keys

Подробная информация с отпечатком:

gpg --fingerprint ivan@example.com
Что такое отпечаток и зачем он нужен? Отпечаток (fingerprint) - это короткая уникальная строка символов (хеш), которая однозначно идентифицирует публичный ключ. Выглядит следующим образом: ```text 1234 5678 9ABC DEF0 1234 5678 9ABC DEF0 1234 5678 ``` Эти 40 16-ричных символов (для RSA 4096) - результат хеширования всего содержимого публичного ключа. Можно использовать его для проверки подлинности ключа (сверив отпечаток с отпечатком владельца), использовать в командах вместо e-mail'a владельца. Также в командах можно использовать сокращенную запись отпечатка - последние 8 или 16 символов.

Пример вывода:

pub   rsa4096 2026-04-02 [SC] [expires: 2028-04-01]
      1234 5678 9ABC DEF0 1234  5678 9ABC DEF0 1234 5678
uid           [ultimate] Иван Петров <ivan@example.com>
sub   rsa4096 2026-04-02 [E] [expires: 2028-04-01]
Построчный комментарий ```text pub rsa4096 2026-04-02 [SC] [expires: 2028-04-01] ```

Строка с публичным ключом. pub - указывает на то, что это публичный ключ. rsa4096 - алгоритм шифрования и размер ключа. 2026-04-02 - дата создания ключа. [SC] - назначение ключа. Буквы означают:

  • S - (sign) - ключ может подписывать другие ключи и документы
  • C (cetrify) - ключ может удостоверять (сертифицировать) другие ключи. Это главный, "мастер-ключ". Используется для управления ключом и подписи субключей. [expires: 2028-04-01] - срок действия ключа. После этой даты ключ будет считаться недействительным.
      1234 5678 9ABC DEF0 1234  5678 9ABC DEF0 1234 5678

Это строка с отпечатком.

uid           [ultimate] Иван Петров <ivan@example.com>

uid - идентификатор пользователя, привязанный к этому ключу. [ultimate] - уровень доверия. Ultimate означает, что вы абсолютно доверяете этому ключу, потому что сами его создали. GPG автоматически присваивает такой уровень доверия вашим личным ключам. Для ключей других людей тут может быть, например, [full] - полное доверие или [unknown] - неизвестный уровень доверия. Иван Петров ivan@example.com - имя и адрес почты, связанные с ключом.

sub   rsa4096 2026-04-02 [E] [expires: 2028-04-01]

Это строка с субключом. sub - указывает на субключ (дополнительный ключ, привязанный к основному). rsa4096 - алгоритм и размер шифрования. [E] - назначение субключа. Буква E означает Encryption. Довольно распространенная практика: мастер-ключ используется только для подписи и сертификации, а для повседневного шифрования данных используется отдельный субключ. Это повышает безопасность в случае компроментации субключа. Далее записан срок действия субключа (обычно совпадает со сроком действия мастер-ключа).

Переопределить эти параметры можно при генерации ключа с флагом --expert, но обычно в этом нет необходимости.

Экспорт публичного ключа

В текстовом формате (для отправки):

gpg --armor --export ivan@example.com > public_key.asc

Экспорт ключа по отпечатку:

gpg --armor --export 123456789ABCDEF0123456789ABCDEF01234567 > public_key.asc

Может пригодиться, если вы сгенерировали несколько ключей, у которых одинаковое имя владельца и адрес электронной почты

Содержимое файла public_key.asc:

-----BEGIN PGP PUBLIC KEY BLOCK-----
mQINBGYj8...
...
-----END PGP PUBLIC KEY BLOCK-----

между началом и концом PGP PUBLIC KEY BLOCK'а находится ваш публичный ключ.

Импорт публичного ключа

Импорт ключа коллеги:

gpg --import colleague_public_key.asc

Проверка, что ключ был импортирован:

gpg --list-keys colleague@example.com

Шифрование файла

Ассиметричное шифрование для конкретного получателя:

gpg --encrypt --recipient colleague@example.com secret.txt

Результат: зашифрованный файл

secret.txt.gpg

Шифрование с указанием имени выходного файла:

gpg --encrypt --recipient colleague@example.com --output secret.gpg secret.txt

Шифрование для нескольких получателей:

gpg --encrypt --recipient user1@example.com --recipient user2@example.com secret.txt

Расшифровка файла

С выводом на экран:

gpg --decrypt secret.gpg

С сохранением в файл:

gpg --decrypt secret.gpg > secret.txt

Расшифровка без вывода:

gpg --quiet --decrypt secret.txt.gpg > secret.txt

При расшифровке GPG запросит парольную фразу:

┌─────────────────────────────────────────────────────────┐
│ Please enter the passphrase to unlock the secret key    │
│                                                         │
│ "Иван Петров <ivan@example.com>"                        │
│ 4096-bit RSA key, ID 1234567890ABCDEF                   │
│                                                         │
│ Passphrase: ************************************        │
└─────────────────────────────────────────────────────────┘

Подпись файла:

Зачем она нужна? Цифровая подпись нужна, чтоб подтвердить авторство и целостность данных. Она решает следующие задачи: подлинность (доказывает, что файл действительно создан владельцем приватного ключа), целостность (если в файл были внесены изменения, то подпись станет недействительной), неотказуемость (владелец ключа не может позже отказаться от своей подписи, если не докажет, что ключ был скомпрометирован).

Как это работает:

  1. Отправитель вычисляет хеш файла;
  2. Хеш шифруется приватным ключом отправителя - это и есть подпись;
  3. Получатель расшифровывает подпись публичным ключом отправителя и сравнивает с хешем полученного файла.

Создание отдельной подписи

gpg --detach-sign --armor document.txt

Результат:

document.txt.asc # файл подписи

Проверка подписи

gpg --verify document.txt.asc document.txt

Вывод при успешной проверке:

gpg: Good signature from "Иван Петров <ivan@example.com>"

Вывод при неуспешной проверке:

# Файл был изменен или подпись не соответствует файлу
gpg: BAD signature from "Иван Петров <ivan@example.com>"
# Файл был поврежден или введен в неверном формате
gpg: can't hash datafile: invalid packet
gpg: [don't knor]: invalid packet (ctb=00)
# В базе данных отсутствует подпись для проверки файла
gpg: Can't check signature: No public key

Удаление ключей:

Удаление публичного ключа:

gpg --delete-keys ivan@example.com

Удаление публичного ключа по отпечатку:

gpg --delete-keys DDA6896DA36A444DB86CC73FE387B6192071F089

Удаление приватного ключа:

gpg --delete-secret-keys ivan@example.com

Удаление обоих ключей:

gpg --delete-secret-and-public-keys ivan@example.com

При наличии нескольких ключей с одним e-mail GPG спросит, какой именно удалить.

Изменение парольной фразы:

gpg --passwd ivan@example.com

Будет вызван диалог для ввода старой и новой парольной фразы.

Структура файлов GPG:

~/.gnupg/
├── pubring.kbx          # связка публичных ключей
├── private-keys-v1.d/   # приватные ключи (зашифрованные)
│   └── ABC123.key
├── trustdb.gpg          # база доверия
└── gpg.conf             # конфигурация

Резервное копирование ключей:

Экспорт приватного ключа:

gpg --armor --export-secret-keys ivan@example.com > private_key.asc

Экспорт публичного ключа:

gpg --armor --export ivan@example.com > public_key.asc

Проверка содержимого экспортированного ключа:

gpg --list-packets public_key.asc | grep "keyid"

Памятка: что точно нельзя делать:

  • Никогда не передавайте приватный ключ другим людям;
  • Не храните парольную фразу рядом с приватным ключом;
  • Не используйте пустую парольную фразу для ключей, работающих с важными данными;
  • Не удаляйте старый ключ, пока не убедитесь, что все данные с ним расшифрованы.

Восстановление после потери парольной фразы:

Если парольная фраза утеряна:

  1. Смириться с потерей - ключ восстановить невозможно
  2. Сгенерировать новую пару ключей
gpg --full-generate-key
  1. Сообщить новый публичный ключ всем, кто отправлял вам зашифрованные данные
  2. Удалить старый ключ
gpg --delete-secret-and-public-keys old@example.com

Файлы, зашифрованные старым ключом, расшифровать больше не получится.