GnuPG

GnuPG является краеугольным камнем подписи и шифрования в *NIX системах. Изначально разработанный под электронную почту, она также нашла своё применение и в многих областях, например в парольных менеджерах или git.

История

В 1991 году благодаря американскому разработчику Филиппу Циммерману появляется проприетарная программа PGP, которая была разработана с учётом вычислительных мощностей тех лет. Это сделало проект очень популярным даже с учётом плохого финансирования.

В 1996 после урегулирования уголовного дела распространения стойких криптографических систем за территорию США, Филипп открыл собственную компанию PGP Inc.

В 1997 году PGP Inc. с поддержкой IETF представила стандарт OpenPGP, позволив разработчикам писать программы, совместимые с PGP, которую на тот момент использовалась во всем мире. Таким образом появились стандарты RFC2440 (1998 год) и RFC4880 (2007 год).

В 1998 году компания FSF начала работу над созданием GnuPG, реализацию стандарта OpenPGP, совместимая с PGP и распространяемую под лицензией GPL. На данный момент данная программа присутствует в большинстве *NIX систем, в том числе и GNU/Linux.

Применение

TL;DR: Далее будут представлены основные команды GPG. Если вы хотите изучить программу более подробно, то рекомендую для начала изучить данные материалы.

В The GNU Privacy Handbook подробно описаны основные команды, функционал, некоторые концепции и общие рекомендации по ежедневному применению GPG.

В The GNU Privacy Guard Manual описана большая часть информации о внутренней работе программы.

В Software list перечислены программы, которые напрямую или косвенно (плагины) работают с GPG.

Создание ключа

Перед началом работы с GPG необходимо создать пару ключей (кроме случаев когда используется симметричное шифрование). После того как пара ключей была создана, публичным ключом можно обмениваться, загрузить на сайт или на сервер ключей.

Воспользовавшись флагом --gen-key можно создать пару ключей:

$ gpg --gen-key

В таком случае программой будет предложено несколько настроек для генерации ключа.

Тип ключа

На данный момент предлагается выбрать DSA (подпись), ElGamal (подпись и шифрование) или оба сразу.

Ничего не мешает сгенерировать ещё больше ключей в будущем, однако если вы пользуетесь GPG впервые, лучше выбирать вариант с обеими ключами.

Длина ключа в битах

Чем длинее ключ, тем выше его криптографическая стойкость и сложнее его скомпрометировать, но взамен (в геометрической прогрессии) увеличиваются размеры подписей и отпечатки (fingerprints), а также падает скорость шифрования.

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

Срок действия ключа

После стечения срока действия ключом всё ещё можно будет пользоваться (поэтому нельзя удалять приватные ключи даже когда срок их действия закончился), однако большинство клиентских программ, которые используют PGP заметят, что ключ перестал действовать и предложат найти новый или сделают это автоматически, также это сделает все новые подписи таким ключом недействительными.

Обычным пользователям достаточно ключа без срока действия, однако нужно понимать что такие ключи со временем теряют свою стойкость, поэтому ключи следует менять примерно раз в год. Это также умешьнит ущерб, нанесённый компроментацией, не давая прочесть данные зашифрованные более старым или более новым ключом.

Данные обладателя ключа

Внимание: после создания ключа данное поле (как и многие другие) будет уже невозможно изменить.

В качестве user ID обычно указывают полное имя пользователя (редко с отчеством) и электронную почту, однако написать в данное поле (с учетом длины в 2048 символов) что угодно, добавив например псевдоним или назначение для этого ключа.

Пароль

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

Ограничений по длине нет, однако рекомендуется использовать не буквенные символы и избегать простых слов, которые подверженны brute force.

Шифрование

GPG в полной мере поддерживает как ассиметричное так и симметричное шифрование. Знание применения обоих методов поможет обезопасить секрет от любопытных глаз.

Ассиметричное шифрование

Для чтения данных, зашифрованным асимметричным алгоритмом шифрования, необходимо знать приватный ключ, когда как для создания зашифрованных данных достаточно публичного. Это возможно из-за того, что некоторые математические операции легко выполнить в одну сторону, но практически невозможно в обратную без знания секрета.

Через комбинацию флагов --encrypt и --recipient можно зашифровать данные:

$ gpg --encrypt --recipient user@example.com example.txt

Данная команда зашифрует публичным ключом user@example.com данные из файла example.txt и выдаст бинарные данные.

Добавив в начало флаг --output с желаемым названием зашифрованные данные можно записать сразу в файл:

$ gpg --output example.txt.gpg --encrypt --recipient user@example.com example.txt

Таким образом мы получим файл example.txt.gpg, готовый к отправке по открытому каналу.

Симметричное шифрование

Можно (и иногда полезно) использовать симметричное шифрование вместо ассиметричного, особенно в тех случаях, когда не требуется передавать парольную фразу ещё кому-либо (например для шифрования собственных файлов).

Симметричное шифрование в отличии от ассиметричного имеет ряд особенностей:

Флаг --symmetric позволяет шифровать данные симметричным способом:

$ gpg --symmetric example.txt

Введя парольную фразу, на выходе мы получим зашифрованный бинарный файл: example.txt.gpg.

Подпись

Помимо шифрования GnuPG применяется также для создания электронных подписей. В отличии от ассиметричного шифрования, хеш подписи создаётся закрытым ключом, а подтвердить правильность этого хеша можно только открытым ключом. В таком случае, если закрытый ключ находится только у его владельца (т.е. он не скомпрометирован), то отправленные данные принадлежат ему.

В GnuPG существуют три вида подписи:

  1. Подписанный файл со сжатием (Signature). Готовый результат - это бинарные файл (.gpg), содержащий исходные данные и подпись.
  2. Подписанный файл без сжатия (Clearsigned documents). Готовый результат представляет собой неизменённые исходные данные, обёрнутые ASCII-защищённой подписью (.asc). Подходит только для простых текстовых данных, электронной почты и USENET.
  3. Подпись в виде отдельного файла (Detached signatures). Готовый результат хранит лишь саму подпись контрольную сумму подписанного файла (.sig), сам же файл остаётся в неизменном виде. Применяется чаще всего.

Для примера создадим новый файл и подпишем его:

Заметка: GnuPG может работать также работать и с pipeline, подписывая вывод других программ, но для лучшего понимая мы воспользуемся этим способом.

$ echo "Hello, world!" > example.txt
$ gpg --clearsign example.txt

Это создаст новый файл со следующим содержимым:

$ cat example.txt.asc
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA256

hello world!

-----BEGIN PGP SIGNATURE-----

iHUEAREIAB0WIQQaMXpzMdJXnIihyLm26VUIOq5LgwUCae+wKgAKCRC26VUIOq5L
g+w2AQCRQq8ewAjQGL6Q3M/QQGmf8xN6Emm9csqKT+YXCyKntgEA0otbsgZ8dEBf
H+ZHyT2CfDtHs0pp15y3K3nEVD8qyoY=
=fzDq
-----END PGP SIGNATURE-----

Таким образом мы получили подписанный читаемый файл. Через флаг --verify можно проверить новую подпись:

$ gpg --verify example.txt.asc
gpg: Signature made Sat 02 May 2026 12:08:29 AM MSK
gpg:                using DSA key 1A317A7331D2579C88A1C8B9B6E955083AAE4B83
gpg: Good signature from "Aleksei Savin Igorevich (Secondary key) <lessavin@hotmail.com>" [ultimate]
gpg: WARNING: not a detached signature; file 'example.txt' was NOT verified!