Коротенький мануал по GPG — GNU Privacy Guard, бесплатной программе для шифрования и цифровых подписей.
Инструкции
Linux — Генерация ключа
Выполняем команду:
$ gpg --full-gen-key
Выбираем тип ключа (1) RSA and RSA (default)
и жмём Enter:
Please select what kind of key you want:
(1) RSA and RSA (default)
(2) DSA and Elgamal
(3) DSA (sign only)
(4) RSA (sign only)
Your selection? 1
Указываем длину ключа (2048 норм, но можно выбрать и побольше, при эпизодических шифрованиях/подписаниях проседания производительности незаметны). Если 2048 ОК, жмём Enter:
RSA keys may be between 1024 and 4096 bits long.
What keysize do you want? (2048)
Указываем срок действия ключа, стандартно пять лет:
Please specify how long the key should be valid.
0 = key does not expire
<n> = key expires in n days
<n>w = key expires in n weeks
<n>m = key expires in n months
<n>y = key expires in n years
Key is valid for? (0) 5y
Подтверждаем, что пять лет это ОК:
Key expires at Пн 02 сен 2024 15:10:41 MSK
Is this correct? (y/N) y
Если хотим, вводим реальное имя (атрибут открытого ключа, который могут прочитать все, имеющие доступ к открытому ключу):
GnuPG needs to construct a user ID to identify your key.
Real name: Ivan Ivanov
Следующее поле прямо влияет на удобство работы корреспондентов — почтовые программы автоматически находят нужный ключ из локального списка ключей, если установлен режим шифрованной передачи почты:
Email address: i.ivanov@mycompany.com
Необязательное поле Comment
:
Comment: Test key
Подтверждаем, что всё введённое ОК:
You selected this USER-ID:
"Ivan Ivanov (Test key) <i.ivanov@mycompany.com>"
Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? O
Вводим пароль для расшифровки закрытого ключа (чтобы, в случае похищения закрытого ключа, злоумышленник не смог им воспользоваться):
┌──────────────────────────────────────────────────────┐
│ Please enter the passphrase to │
│ protect your new key │
│ │
│ Passphrase: ________________________________________ │
│ │
│ <OK> <Cancel> │
└──────────────────────────────────────────────────────┘
В случае утери, восстановить пароль, кроме как полным перебором, за приемлемое время невозможно! Убедительная просьба сначала сгенерить и сохранить его, например, в KeePass, а после ввести в gpg.
Ждём, пока программа сгенерирует закрытый ключ и получаем сведения о вновь созданной ключевой паре:
We need to generate a lot of random bytes. It is a good idea to perform
some other action (type on the keyboard, move the mouse, utilize the
disks) during the prime generation; this gives the random number
generator a better chance to gain enough entropy.
We need to generate a lot of random bytes. It is a good idea to perform
some other action (type on the keyboard, move the mouse, utilize the
disks) during the prime generation; this gives the random number
generator a better chance to gain enough entropy.
gpg: /home/iivanov/.gnupg/trustdb.gpg: trustdb created
gpg: key 6C29A802EAB3EEBF marked as ultimately trusted
gpg: directory '/home/iivanov/.gnupg/openpgp-revocs.d' created
gpg: revocation certificate stored as '/home/iivanov/.gnupg/openpgp-revocs.d/D725486ABD7E69297D3E15CD6C29A802EAB3EEBF.rev'
public and secret key created and signed.
pub rsa2048 2019-09-04 [SC] [expires: 2024-09-02]
D725486ABD7E69297D3E15CD6C29A802EAB3EEBF
uid Ivan Ivanov (Test key) <i.ivanov@ntechlab.com>
sub rsa2048 2019-09-04 [E] [expires: 2024-09-02]
Обмен ключами
Экспорт открытого ключа
Перед получением зашифрованного сообщения, необходимо передать открытый ключ своему корреспонденту, который хочет отправить шифровку. Для этого смотрим имеющийся у нас список ключей:
$ gpg -k
Полный (он же длинный) идентификатор ключей выводится вот такой командой:
gpg --keyid-format LONG -k
Выбираем нужный ключ из списка (копируем его ID: D725486ABD7E69297D3E15CD6C29A802EAB3EEBF)
/home/iivanov/.gnupg/pubring.kbx
------------------------
pub rsa2048 2019-09-04 [SC] [expires: 2024-09-02]
D725486ABD7E69297D3E15CD6C29A802EAB3EEBF
uid [ultimate] Ivan Ivanov (Test key) <i.ivanov@mycompany.com>
sub rsa2048 2019-09-04 [E] [expires: 2024-09-02]
и экспортируем его в файл, закодированный в base64:
$ gpg -a --export D725486ABD7E69297D3E15CD6C29A802EAB3EEBF > /tmp/pkey.asc
Содержимое файла будет выглядеть примерно так:
-----BEGIN PGP PUBLIC KEY BLOCK-----
mQENBF1vrh8BCACXKHa9U1wdrszBAXh24HfFscsz9agwJaJvaihKYHI9iREV15/D
...много похожих строк...
-----END PGP PUBLIC KEY BLOCK-----
Отдаём содержимое этого файла корреспонденту. По другому каналу (личная встреча, телефонный звонок) убеждаемся, что ID ключа у корреспондента совпадает с исходно сгенерированным, дабы исключить возможную подмену.
Импорт открытого ключа
Чтобы отправлять зашифрованные сообщения, необходимо импортировать открытый ключ получателя. Так же, как и передаче своего сообщения, по другому каналу необходимо убедиться в подлинности ключа.
Ключ импортируется следующим образом:
$ gpg --import i.ivanov.pkey.asc
получаем сообщение об успешном импорте:
gpg: key 674BD323E193D06D: public key "Ivan Ivanov <i.ivanov@mycompany.com>" imported
gpg: Total number processed: 1
gpg: imported: 1
Чтобы при отправке шифровки система не переспрашивала, доверяем ли мы этому ключу, повысим уровень доверия. Выводим список открытых ключей (выбираем ID ключа, доверие к которому хотим повысить: C973F1E2B626BA80B880FE8D674BD323E193D06D):
/home/iivanov/.gnupg/pubring.kbx
------------------------
pub rsa2048 2019-09-04 [SC] [expires: 2024-09-02]
D725486ABD7E69297D3E15CD6C29A802EAB3EEBF
uid [ultimate] Ivan Ivanov (Test key) <i.ivanov@mycompany.com>
sub rsa2048 2019-09-04 [E] [expires: 2024-09-02]
pub rsa4096 2018-11-02 [SC] [expires: 2023-11-01]
C973F1E2B626BA80B880FE8D674BD323E193D06D
uid [ unknown] Petr Petrov <p.petrov@mycompany.com>
sub rsa4096 2018-11-02 [E] [expires: 2023-11-01]
переходим в режим правки ключа:
$ gpg --edit-key C973F1E2B626BA80B880FE8D674BD323E193D06D
в появившейся консоли gpg говорим trust
:
gpg (GnuPG) 2.2.17; Copyright (C) 2019 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.
pub rsa4096/674BD323E193D06D
created: 2018-11-02 expires: 2023-11-01 usage: SC
trust: unknown validity: unknown
sub rsa4096/1CABB6C0C7A14100
created: 2018-11-02 expires: 2023-11-01 usage: E
[ unknown] (1). Ivan Ivanov <i.ivanov@mycompany.com>
gpg> trust
Если ключ удалось подтвердить по независимому каналу, указываем пятый уровень (I trust ultimately) и подтверждаем выбор вводом y
и жмём Enter:
pub rsa4096/674BD323E193D06D
created: 2018-11-02 expires: 2023-11-01 usage: SC
trust: unknown validity: unknown
sub rsa4096/1CABB6C0C7A14100
created: 2018-11-02 expires: 2023-11-01 usage: E
[ unknown] (1). Ivan Ivanov <i.ivanov@mycompany.com>
Please decide how far you trust this user to correctly verify other users' keys
(by looking at passports, checking fingerprints from different sources, etc.)
1 = I don't know or won't say
2 = I do NOT trust
3 = I trust marginally
4 = I trust fully
5 = I trust ultimately
m = back to the main menu
Your decision? 5
Do you really want to set this key to ultimate trust? (y/N) y
получаем сообщение об изменении уровня доверия ключу:
pub rsa4096/674BD323E193D06D
created: 2018-11-02 expires: 2023-11-01 usage: SC
trust: ultimate validity: unknown
sub rsa4096/1CABB6C0C7A14100
created: 2018-11-02 expires: 2023-11-01 usage: E
[ unknown] (1). Ivan Ivanov <i.ivanov@mycompany.com>
Please note that the shown key validity is not necessarily correct
unless you restart the program.
gpg>
и выходим из консоли gpg с помощью Ctrl-d
.
Обмен зашифрованными сообщениями
Отправка зашифрованного сообщения
Перед отправкой зашифрованного сообщения (в случае шифрования и отправки зашифрованного сообщения с помощью почтовой программы это действие чаще всего происходит автоматически) уточняем ID ключа получателя с помощью команды gpg -k
. Шифруем файл с сообщением:
$ gpg -ea -r C973F1E2B626BA80B880FE8D674BD323E193D06D plain_message.txt
зашифрованная копия этого файла автоматически сохранится в plain_message.txt.asc
. Если нужно задать конкретное имя зашифрованному файлу, команда будет выглядеть следующим образом:
$ gpg -ea -o for_ivanov.asc -r D725486ABD7E69297D3E15CD6C29A802EAB3EEBF plain_message.txt
Важно: Порядок опций должен идти строго так, как задано в примере. По какой-то причине другой порядок, например, имя зашифрованной копии в конце команды, gpg не понимает.
Где опции команды означают следующее:
-e
— шифровать сообщение;-a
— результат закодировать в base64;-r
— ID ключа или адрес электронной почты получателя шифровки.
Результатом выполнения команды должен быть файл примерно такого вида:
-----BEGIN PGP MESSAGE-----
hQIMAxyrtsDHoUEAAQ/+M3NYvPh6xvPLzxmftRLcMWqRmR42Xxs4+vWAlt047zFQ
...много похожих строк...
-----END PGP MESSAGE-----
Наличие -----BEGIN PGP MESSAGE-----
говорит о том, что это сообщение зашифровано и его можно смело отправлять получателю по незащищённому каналу связи.
Получение зашифрованного сообщения
Выполняется командой
$ gpg -o for_iivanov.txt -d for_iivanov.gpg.asc
где опции:
-o
— имя расшифрованного файла;-d
— имя файла для расшифровки.
команда скажет, каким ключом было зашифровано сообщение:
gpg: encrypted with 2048-bit RSA key, ID 7FA3C70345848788, created 2019-09-04
"Ivan Ivanov (Test key) <i.ivanov@mycompany.com>"
После вводим пароль для расшифровки закрытого ключа, который вводили на этапе генерации ключевой пары, и получаем расшифрованный файл.
Цифровая подпись
Подписание сообщений
Чтобы гарантировать подлинность и неотчуждаемость сообщения, используется цифровая подпись. Есть два основных типа цифровой подписи:
- Отделённая — содержимое подписи хранится в отдельном файле от подписываемого;
- Внедрённая — подписываемое сообщение и сама подпись хранятся в одном файле.
Создание отделённой подписи:
$ gpg -o signature.asc -a -u D725486ABD7E69297D3E15CD6C29A802EAB3EEBF --detach-sig message2sign.txt
опция -u
указывает ID закрытого ключа, которым нужно подписать сообщение. Если подписант обладает только одним закрытым ключом, эту опцию можно не указывать (т.е. -u D725486ABD7E69297D3E15CD6C29A802EAB3EEBF
).
Создание внедрённой подписи:
$ gpg -o signed_message.asc -a -u D725486ABD7E69297D3E15CD6C29A802EAB3EEBF --clearsign message2sign.txt
Содержимое файла с внедрённой цифровой подписью (signed_message.asc
) выглядит так:
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA256
Это я-на.
-----BEGIN PGP SIGNATURE-----
iQEzBAEBCAAdFiEE1yVIar1+aSl9PhXNbCmoAuqz7r8FAl1vwbYACgkQbCmoAuqz
...много похожих строк...
=XRwC
-----END PGP SIGNATURE-----
Есть ещё один способ создания внедрённой подписи (с менее читабельным результатом):
$ gpg -o signed_message.asc -a -u D725486ABD7E69297D3E15CD6C29A802EAB3EEBF -s message2sign.txt
результат:
-----BEGIN PGP MESSAGE-----
owEBbQGS/pANAwAIAWwpqALqs+6/AawmYhBtZXNzYWdlMnNpZ24udHh0XW/DnNCt
...много похожих строк...
=yYVo
-----END PGP MESSAGE-----
Для простого текста, требующего цифровой подписи, лучше использовать “первую” внедрённую подпись (создаваемую опцией clearsign
).
Проверка подписей
Внедрённая подпись:
$ gpg --verify signed_message.asc
результат:
gpg: Signature made Ср 04 сен 2019 16:52:54 MSK
gpg: using RSA key D725486ABD7E69297D3E15CD6C29A802EAB3EEBF
gpg: Good signature from "Ivan Ivanov (Test key) <i.ivanov@ntechlab.com>" [ultimate]
Отделённая подпись:
$ gpg --verify signature.asc message2sign.txt
результат:
gpg: Signature made Ср 04 сен 2019 16:56:41 MSK
gpg: using RSA key D725486ABD7E69297D3E15CD6C29A802EAB3EEBF
gpg: Good signature from "Ivan Ivanov (Test key) <i.ivanov@ntechlab.com>" [ultimate]
Отправка подписанных шифровок
$ gpg -ea -s -u D725486ABD7E69297D3E15CD6C29A802EAB3EEBF -r C973F1E2B626BA80B880FE8D674BD323E193D06D message2signencrypt.txt
При расшифровке таких сообщений в выводе команды будет добавлена информация о цифровой подписи, например:
gpg: encrypted with 2048-bit RSA key, ID 7FA3C70345848788, created 2019-09-04
"Ivan Ivanov (Test key) <i.ivanov@ntechlab.com>"
gpg: Signature made Ср 04 сен 2019 17:07:58 MSK
gpg: using RSA key C973F1E2B626BA80B880FE8D674BD323E193D06D
gpg: Good signature from "Petr Petrov <p.petrov@mycompany.com>" [ultimate]
Расшифровываются такие сообщения так же, как и просто зашифрованные.
Если есть вопросы задавайте их в комментариях. Понравилась статья? Расскажите о ней друзьям в социальных сетях.