PGP, OpenPGP и GPG
PGP, Pretty Good Privacy, создал Фил Циммерман в начале 1990-х, чтобы обычные люди могли шифровать почту. Позже формат стандартизировали как OpenPGP, а свободная реализация получила название GnuPG, сокращённо GPG. Сегодня чаще всего в командной строке используют именно gpg, а сам формат называют OpenPGP.
Идея опирается на асимметричное шифрование: у каждого человека есть пара ключей. Открытым ключом можно зашифровать сообщение или проверить подпись, а закрытым расшифровать или подписать. Открытый ключ публикуют или отправляют коллегам, закрытый хранят в секрете.
Как шифруется письмо на самом деле
Асимметричные алгоритмы медленные, поэтому применяют гибридную схему. Программа генерирует случайный сеансовый ключ и им шифрует само сообщение быстрым симметричным шифром. Затем сам сеансовый ключ шифруется открытым ключом получателя, а если получателей несколько, по копии на каждого. Всё вместе отправляется одним пакетом.
При подписи схема другая. Программа считает хеш сообщения и преобразует его закрытым ключом автора. Получатель проверяет подпись открытым ключом. Подробнее этот принцип показан в статье об электронной подписи. Можно только подписать письмо, только зашифровать или сделать оба действия сразу.
Сеть доверия вместо центров
Главный вопрос любой схемы с открытыми ключами: как убедиться, что ключ принадлежит человеку, а не подделан. В отличие от сертификатов сайтов, где ответ даёт центр сертификации, в PGP используется модель сети доверия. Люди подписывают ключи друг друга после личной проверки, скажем при встрече, и если вы доверяете тому, кто подписал ключ, вы можете доверять и ему.
На практике подтверждают отпечаток ключа: это короткая строка из шестнадцатеричных символов, полученная хешированием. Сверить её можно по телефону или при встрече. Такой способ надёжнее любых слепых загрузок ключей с серверов, потому что на сервере может оказаться чужая версия.
Почему PGP не стал массовым
У PGP репутация сложного инструмента. Нужно самому управлять ключами, хранить резервную копию закрытого ключа, продлевать сроки, публиковать открытый ключ и отзывать его при утечке. Ошибки пользователя ведут к потере доступа или к раскрытию ключа. Почтовые клиенты поддерживают его неравномерно.
Ещё одна слабость: письмо шифруется, но тема, адреса отправителя и получателя и время остаются открытыми, как метаданные. И у формата нет прямой секретности: если закрытый ключ когда-нибудь утечёт, все сохранённые письма можно расшифровать. Поэтому для личной переписки сегодня чаще берут мессенджеры со сквозным шифрованием, а PGP остаётся для подписи программ, релизов и специфических рабочих процессов.
Как попробовать и что проверить
Создайте ключ командой gpg --full-generate-key и задайте надёжную парольную фразу. Список ключей выводит gpg --list-keys, а отпечаток показывает gpg --fingerprint. Зашифровать файл для получателя можно командой gpg --encrypt --recipient имя файл, подпись создаёт gpg --sign.
Сразу же сделайте сертификат отзыва и сохраните его отдельно: он пригодится, если закрытый ключ потеряется или будет раскрыт. Проверяя чужой ключ, сверяйте отпечаток по независимому каналу. Для разработчиков пригодится проверка подписей в релизах программ: если рядом с файлом лежит подпись, команда gpg --verify скажет, совпадает ли она.
Подпись релизов и коммитов
Наиболее живая область применения PGP сегодня связана с разработкой. Авторы программ подписывают релизы, а пользователи проверяют подпись и убеждаются, что архив создан тем, кому вы доверяете. Так же подписывают коммиты в системах контроля версий, а пакетные менеджеры ряда дистрибутивов проверяют подписи репозиториев автоматически. Для этого достаточно один раз получить открытый ключ издателя и сверить его отпечаток по независимому источнику. Дальше проверка выполняется командой, и любое изменение архива приведёт к сообщению о неверной подписи. Полезно также знать срок действия ключа издателя и следить за объявлениями о смене ключа, чтобы не отвергать корректные новые релизы и не принимать подписи, поставленные отозванным ключом.