Главная » Хабрахабр » [Из песочницы] Используем GPG для шифрования сообщений и файлов

[Из песочницы] Используем GPG для шифрования сообщений и файлов

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

GPG используется для шифрования информации и предоставляет различные алгоритмы (RSA, DSA, AES и др.) для решения этой задачи. GPG (также известный как GnuPG) создавался как свободная альтернатива несвободному PGP.

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

Установка GPG

Windows

Скачайте и установите Gpg4win.

GNU/Linux

Если же он у вас не установлен, установите пакет gnupg с помощью своего пакетного менеджера или соберите его из исходников. В большинстве дистрибутивов GNU/Linux GPG уже установлен.

Использование

2. Здесь будет приведено только использование в Linux (на момент написания статьи последней версией GPG является 2. 6)

Насколько я помню, это были две разные версии: 1. Для начала стоит уточнить, что в большинстве дистрибутивов Linux есть два бинарных файла: gpg и gpg2. 0.x, и для удобного использования я делал alias, чтобы при запуске gpg выполнялся gpg2. 4.x и 2. Проверить это можно выполнив file /bin/gpg2. Сейчас же в Debian и Arch Linux /bin/gpg2 является символической ссылкой на /bin/gpg и потребность в таких манипуляциях пропала.

Итак, начнём!

Введя gpg без аргументов он создаст необходимые ему файлы (если они ещё не созданы) и будет ждать ввода шифруемой информации.

user@PC:~$ gpg
gpg: создан каталог '/home/user/.gnupg'
gpg: создан щит с ключами '/home/user/.gnupg/pubring.kbx'
gpg: Внимание: команда не отдана. Пытаюсь угадать, что имелось в виду ...
gpg: Пишите сообщение ...

Но пока что у нас нет ключа. При наличии ключа мы можем ввести текст, нажать сочетание клавиш Ctrl + D и получить порцию кракозябр прямо в консоль.

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

Чтобы создать ключ, нужно запустить gpg с аргументом "--full-generate-key" (можно и с "--gen-key", но в этом случае у нас не будет выбора некоторых важных параметров):

user@PC:~$ gpg --full-generate-key
gpg (GnuPG) 2.2.6; Copyright (C) 2018 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Выберите тип ключа: (1) RSA и RSA (по умолчанию) (2) DSA и Elgamal (3) DSA (только для подписи) (4) RSA (только для подписи)
Ваш выбор?

Вы можете выбрать любой вариант, но учтите, что выбрав третий или четвёртый вариант вы не сможете шифровать сообщения и файлы!

...
Ваш выбор? 1
длина ключей RSA может быть от 1024 до 4096.
Какой размер ключа Вам необходим? (2048)

Для RSA ключа размером 2048 бит вполне достаточно, но вы можете выбрать размер до 4096 бит (использовать ключи размера меньше 2048 бит небезопасно).

...
Какой размер ключа Вам необходим? (2048) 2048
Запрошенный размер ключа - 2048 бит
Выберите срок действия ключа. 0 = не ограничен <n> = срок действия ключа - n дней <n>w = срок действия ключа - n недель <n>m = срок действия ключа - n месяцев <n>y = срок действия ключа - n лет
Срок действия ключа? (0)

Вы можете продлить срок действия ключа, пока он не истечёт. Если вы выберете ограниченный срок действия ключа, то по истечению его срока ключ будет признан недействительным.

GPG спросит, верно ли мы указали срок, и если да, то нужно будет указать имя, адрес электронной почты и примечание (всё это опционально, но нужно указать хотя бы что-то одно).

...
Ключ действителен до Чт 01 января 1970 00:00:00 +00
Все верно? (y/N) y GnuPG должен составить идентификатор пользователя для идентификации ключа. Ваше полное имя: Habrahabr User
Адрес электронной почты: habr@habr.com
Примечание: My own key
Вы выбрали следующий идентификатор пользователя: "Habrahabr User (My own key) <habr@habr.com>" Сменить (N)Имя, (C)Примечание, (E)Адрес; (O)Принять/(Q)Выход?

Здесь вы можете сделать правки либо продолжить.

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

Если вы не любите окошки

Помимо tty-версии (консольной) есть ещё несколько версий (графических), которые вы можете попробовать.
Затем перезапустите gpg-agent. Добавьте в файл ~/.gnupg/gpg-agent.conf данную строчку:
pinentry-program /usr/bin/pinentry-tty
Pynentry — это те самые диалоговые окна. На системах с systemd это делается так:
systemd --user reload gpg-agent

...
Необходимо получить много случайных чисел. Желательно, чтобы Вы
в процессе генерации выполняли какие-то другие действия (печать
на клавиатуре, движения мыши, обращения к дискам); это даст генератору
случайных чисел больше возможностей получить достаточное количество энтропии.
Введите фразу-пароль
для защиты нового ключа
Фраза-пароль:

В терминале вводимый пароль никак не отображается!

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

...
Фраза-пароль: Повторите: Необходимо получить много случайных чисел. Желательно, чтобы Вы
в процессе генерации выполняли какие-то другие действия (печать
на клавиатуре, движения мыши, обращения к дискам); это даст генератору
случайных чисел больше возможностей получить достаточное количество энтропии.
gpg: /home/user/.gnupg/trustdb.gpg: создана таблица доверия
gpg: ключ 5699884482E426AC помечен как абсолютно доверенный
gpg: создан каталог '/home/user/.gnupg/openpgp-revocs.d'
gpg: сертификат отзыва записан в '/home/user/.gnupg/openpgp-revocs.d/2BB6803FCF82316969619C155699884482E426AC.rev'.
открытый и секретный ключи созданы и подписаны. pub rsa2048 1970-01-01 [SC] 2BB6803FCF82316969619C155699884482E426AC
uid Habrahabr User (My own key) <habr@habr.com>
sub rsa2048 1970-01-01 [E]

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

Итак, что же означают все эти странные последние строки?

E426AC — Отпечаток ключа. rsa — Алгоритм шифрования RSA.
2048 — Длина ключа.
1970-01-01 — Дата создания ключа.
2BB680... Его следует сверять при импортировании чужого публичного ключа — у обоих сторон он должен быть одинаков.
uid — Идентификатор (User-ID).
pub и sub — Типы ключа:

pub — Публичный ключ.
sub — Публичный подключ.
sec — Секретный ключ.
ssb — Секретный подключ.

Когда вы создаёте ключ, вы получаете аж 4 криптоключа: для шифрования, расшифровки, подписи и проверки подписи: [SC] и [E] — Предназначение каждого ключа.

Об этом пойдёт речь чуть позже.
E — Шифрование (Encryption).
A — Авторизация (Authentication). S — Подпись (Signing).
C — Подпись ключа (Certification). Может использоваться, например, в SSH.

Для того, чтобы подтвердить, что сообщение написано именно вами и не изменилось в процессе передачи. Зачем нужно подписывать сообщения? Если сообщение будет изменено, то при проверке подписи это будет указано.

Конфигурация

Файл конфигурации хранится в файле ~/.gnupg/gpg.conf
Вот, например, пример моего файла конфигурации, который я рекомендую себе поставить:

keyid-format 0xlong
throw-keyids
no-emit-version
no-comments

У каждого ключа и подключа есть свой идентификатор. keyid-format 0xlong — формат вывода идентификатора ключа. По умолчанию он не выводится, раньше выводилась его короткая версия.
Доступные форматы:
none — Не выводить (По умолчанию).
short — Короткая запись.
0xshort — Короткая запись с префиксом "0x".
long — Длинная запись.
0xlong — длинная запись с префиксом "0x".

Эта опция может быть полезна для анонимизации получателя сообщения. throw-keyids — Не включать информацию о ключе в зашифрованное сообщение.

no-emit-version — Не вставлять версию GPG в зашифрованное сообщение.

no-comments — Убирает все комментарии из зашифрованного сообщения.

В файле конфигурации они записываются без префикса "--". Всё это — опции, которые можно найти в man-странице.

Команды и опции

Я опишу только самое основное.

При шифровании GPG по умолчанию создаёт бинарный вывод. --armor
-a — Создаёт ASCII вывод. Такой вывод можно отправить по электронной почте или вывести на экран. При использовании этой опции GPG кодирует информацию кодировкой Radix-64 (Разновидность Base64).

--encrypt
-e — Зашифровать сообщение.

Можно использовать информацию идентификатор пользователя (имя, почта), идентификатор ключа, отпечаток ключа. --recipient
-r — Указать ключ, который будет использоваться для шифрования.

--decrypt
-d — Расшифровать сообщение.

Подпись при этом будет распологаться отдельно от самого сообщения. --sign
-s — Подписать сообщение.

Подпись при этом сохраняется вместе с сообщением. --clear-sign
--clearsign — Подписать сообщение.

Схож с опцией --recipient, но это не одно и то же. --local-user
-u — Указать ключ, который будет использоваться для подписи.

--verify — Проверить подпись.

--list-keys
-k — Вывести список публичных ключей.

--list-secret-keys
-K — Вывести список приватных ключей.

--export — экспортировать публичный ключ в файл, который потом можно куда нибудь отправить.

--import — импортировать публичный ключ.

--edit-key — Редактировать ключ.

Примеры

При этом готовый файл будет текстовым, а не бинарным. gpg -a -r 0x12345678 -e decrypted.txt > encrypted.gpg
Зашифровать файл decrypted.txt в файл encrypted.gpg ключом 0x12345678.

gpg -r 0x12345678 -d encrypted.gpg > decrypted.txt
Расшифровать файл encrypted.gpg ключом 0x12345678 и сохранить его в файл decrypted.txt.

gpg -u 0x12345678 -s message.txt > sign.asc
Подписать файл message ключом 0x12345678 и сохранить подпись в файл sign.asc.

gpg -r 0x12345678 --clearsign message.txt > message.gpg
Подписать файл message.txt ключом 0x12345678 и записать сообщение с подписью в файл message.gpg.

gpg --verify message.asc message.txt
Проверить подпись файла message.txt, которая записана в файле message.asc.

gpg --import pubkey.gpg
Импортировать публичный ключ из файла pubkey.gpg.

Редактирование ключа, подпись чужих ключей и отправка ключа на сервер ключей

Ключ редактируется командой gpg --edit-key <keyid>.
После ввода этой команды вы увидите это:

user@PC:~$ gpg --edit-key CCA230DA07929EB7
gpg (GnuPG) 2.2.6; Copyright (C) 2018 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Секретный ключ доступен. sec rsa2048/CCA230DA07929EB7 создан: 2018-05-08 годен до: никогда назначение: SC доверие: абсолютное достоверность: абсолютное
ssb rsa2048/7859E2A888E31276 создан: 2018-05-08 годен до: никогда назначение: E [ абсолютно ] (1). Habrahabr User (My own key) <habr@habr.com> gpg>

Так вы можете подтвердить то, что владелец подписываемого ключа является тем, за кого он себя выдаёт. Доступные команды вы можете узнать, введя help.
Здесь мы можем добавить различные подключи, добавить идентификаторы пользователя, а также подписать чужие публичные ключи.
Для чего нужно подписывать ключи? Пример: Алиса подписала публичный ключ Боба, а Боб подписал публичный ключ Чарли. Таким образом вы создаёте так называемую "Сеть Доверия". Бобом. Если Алиса получит публичный ключ Чарли, она сможет ему доверять, потому что ключ подписан тем, кому Алиса доверяет, т.е. Для того, чтобы получить подписи для своего ключа, люди даже устраивают специальные встречи, где они обмениваются своими публичными ключами и подписывают их.

Сервер ключей — это специальный сервер, хранящий публичные ключи. Теперь о серверах ключей. Сервера ключей используются для распространения публичных ключей.

Ключи, отправленные на сервер ключей, невозможно удалить! Внимание! Их можно только отозвать, импортировав сертификат отзыва на сервер, при этом ключ всё равно остаётся на сервере.

Отправить публичный ключ на сервер:
gpg --keyserver <URL> --send-keys <keyid>

Получить публичный ключ с идентификатором ключа с сервера :
gpg --keyserver <URL> --recv-keys <keyid>

Получить обновления ключей с сервера:
gpg --keyserver <URL> --refresh-keys

Найти ключ на сервере:
gpg --keyserver <URL> --search-keys <UID или Keyid>

Для удобства можно прописать адрес сервера ключей в gpg.conf, чтобы не прописывать его в командах:
keyserver <URL>

Где вы можете столкнуться с использованием GPG

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

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

При установке пакетов эти подписи проверяются. Пакетные менеджеры
Все пакеты подписываются разработчиками для защиты от изменений. Делается это всё автоматически без вмешательства пользователя.

Ссылки

Сайт GPG
Статья о GPG в Википедии
Сайт, посвящённый ИБ и GPG
Сервера ключей:
pgp.mit.edu
keyserver.pgp.com


Оставить комментарий

Ваш email нигде не будет показан
Обязательные для заполнения поля помечены *

*

x

Ещё Hi-Tech Интересное!

KDD 2018, день второй, семинары

Побывал на двух таких тусовках. Сегодня на KDD 2018 день семинаров — вместе с большой конференцией, которая начнется завтра, несколько групп собрали слушателей по некоторым специфичным темам. Анализ временных рядов С утра хотел пойти на семинар по анализу графов, но ...

Zabbix на стероидах: как устроена единая платформа мониторинга Сбертеха

Привет, Хабр! Меня зовут Сергей Прутских, я руковожу направлением мониторинга компании «Сбербанк-Технологии». Основная задача нашей организации — разработка и тестирование программных продуктов для Сбербанка. Для этого в компании сосредоточена крупная ИТ-инфраструктура — 15 тысяч серверов разделены примерно на 1500 тестовых ...