Команда | Что делает | На чьей стороне |
---|---|---|
gpg --full-generate-key |
Генерируем ключи | Получатель файла |
gpg --armor --export {KEY_ID} > {KEY_ID}.pub.gpg |
Выгрузка ключа для передачи | Получатель файла |
gpg --import {KEY_ID}.pub.gpg |
Импорт ключа для шифрования | Владелец файла |
gpg -r {KEY_ID} -e {FILE} |
Шифрование файла | Владелец файла |
gpg -d {FILE}.gpg > {FILE} |
Дешифровка файла | Получатель файла |
С помощью утилиты gpg
из пакета gnupg
можно сгенерировать пару ключей для шифрования и дешифрования,
подписи, а так же произведения этих действий над сообщениями и файлами.
В большинстве случаев установлен сразу, но если команды gpg
нет:
brew install gnupg
для MacOS используя brew- gpg4win для Windows
sudo apt-get update; sudo apt-get -y install gnupg
для Linux Ubuntu- https://www.gnupg.org/download/index.html для других систем
Для создания пары ключей нужно запустить команду gpg --full-generate-key
:
$ gpg --full-generate-key
gpg (GnuPG) 2.3.4; Copyright (C) 2021 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.
Please select what kind of key you want:
(1) RSA and RSA
(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
Your selection?
Please select which elliptic curve you want:
(1) Curve 25519 *default*
(4) NIST P-384
(6) Brainpool P-256
Your selection?
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)
Key does not expire at all
Is this correct? (y/N) y
GnuPG needs to construct a user ID to identify your key.
Real name: Иван Петров
Email address: [email protected]
Comment: Ключ для проверки
You are using the 'utf-8' character set.
You selected this USER-ID:
"Иван Петров (Ключ для проверки) <[email protected]>"
Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? O
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: revocation certificate stored as '/Users/ivan-petrov/.gnupg/openpgp-revocs.d/5CBC20AE76404AAB080F97F6AADFC795DA003886.rev'
public and secret key created and signed.
pub ed25519 2023-04-14 [SC]
5CBC20AE76404AAB080F97F6AADFC795DA003886
uid Иван Петров (Ключ для проверки) <[email protected]>
sub cv25519 2023-04-14 [E]
Все сгенерированные ключи хранятся в связке и их можно увидеть командами:
$ gpg --list-keys # публичные ключи
/Users/ivan-petrov/.gnupg/pubring.gpg
------------------------------
pub ed25519 2023-04-14 [SC]
5CBC20AE76404AAB080F97F6AADFC795DA003886
uid [ultimate] Иван Петров (Ключ для проверки) <[email protected]>
sub cv25519 2023-04-14 [E]
$ gpg --list-secret-keys
/Users/ivan-petrov/.gnupg/pubring.gpg
------------------------------
sec ed25519 2023-04-14 [SC]
5CBC20AE76404AAB080F97F6AADFC795DA003886
uid [ultimate] Иван Петров (Ключ для проверки) <[email protected]>
ssb cv25519 2023-04-14 [E]
Внимание! Не передавайте секретные ключи по незащищенным каналам во избежание утечек.
Чтобы выгрузить публичный ключ — используем --export
и передаём id ключа (этот ключ нужно передать партнёру):
$ gpg --export --armor 5CBC20AE76404AAB080F97F6AADFC795DA003886 > ~/pubkey.gpg
$ cat ~/pubkey.gpg
-----BEGIN PGP PUBLIC KEY BLOCK-----
mDMEZDkRlhYJKwYBBAHaRw8BAQdABErysVZojlAKyf2fGHASj1RnDz277Mtc0LFk
q+pA53i0T9CQ0LvQtdC60YHQtdC5INCv0YDQvtGI0LXQstC40YcgKNCa0LvRjtGH
INC00LvRjyDQv9GA0L7QstC10YDQutC4KSA8cWZveEB5YS5ydT6IlAQTFgoAPBYh
BFy8IK52QEqrCA+X9qrfx5XaADiGBQJkORGWAhsDBQsJCAcCAyICAQYVCgkICwIE
FgIDAQIeBwIXgAAKCRCq38eV2gA4hoc4AQDq7XJ16+bu3fkxA8sRY4n7U+rb3qKK
YPdOPDeyk6McFgEA7WS6FXh6psE+W71lhZKPryabY7eE7AW2PqTGC71g6A64OARk
ORGWEgorBgEEAZdVAQUBAQdAkWFYj4cyYZQ6J2LcTlt7vJx+trhQGLeyyGGQ4XCk
2WADAQgHiHgEGBYKACAWIQRcvCCudkBKqwgPl/aq38eV2gA4hgUCZDkRlgIbDAAK
CRCq38eV2gA4hjxlAQCC6ehdGz/jo6+aOQX/qkutDJUhu2BnArxRgOqV/3doAQD/
cQAp5F2qFOTOfJ7sr/JeTeIvZogFUP4NGzB/9hjtig8=
=THRK
-----END PGP PUBLIC KEY BLOCK-----
Чтобы загрузить ключ партнёра в хранилище для расшифровки его данных используем --import
:
$ gpg --import ~/pubkey.gpg
gpg: key AADFC795DA003886: "Иван Петров (Ключ для проверки) <[email protected]>" not changed
gpg: Total number processed: 1
gpg: unchanged: 1
С помощью публичного ключа партнёра мы можем зашифровать сообщение, которое сможет расшифровать только обладатель секретного ключа из пары — партнер.
Команды могут немного отличаться между разными OS
Чтобы зашифровать сообщение нужно запустить команду gpg
с указанием ключа или получателя в --recipient
и файла в --encrypt
:
$ echo 'Приветик!' > themessage.txt
$ gpg -r 5CBC20AE76404AAB080F97F6AADFC795DA003886 -e message.txt
$ ls themessage.txt*
themessage.txt themessage.txt.gpg
Файл themessage.txt.gpg
зашифрован и чтобы его прочитать нужна секретная (приватная) часть пары.
Теперь этот файл можно безопасно передавать партнёру по незащищённому каналу.
Запускаем gpg
с параметром --decrypt
на той машинке, где есть секретная часть пары ключа, и файл будет расшифрован, а нам останется его записать:
$ gpg -d themessage.txt.gpg > themessage.txt
gpg: encrypted with cv25519 key, ID 38D43D06C54F4498, created 2023-04-14
"Иван Петров (Ключ для проверки) <[email protected]>"
$ cat themessage.txt
Приветик!
Подробнее про gpg
можно почитать в документации и различных статьях, например: https://habr.com/ru/articles/358182/