👁 127

GPG инструкции

Коротенький мануал по 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]

Обмен ключами

Экспорт открытого ключа

Читайте также:  Linux - простыми словами

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

$ 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.

Обмен зашифрованными сообщениями

Отправка зашифрованного сообщения

Читайте также:  Linux - простыми словами

Перед отправкой зашифрованного сообщения (в случае шифрования и отправки зашифрованного сообщения с помощью почтовой программы это действие чаще всего происходит автоматически) уточняем 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>"

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

Цифровая подпись

Подписание сообщений

Чтобы гарантировать подлинность и неотчуждаемость сообщения, используется цифровая подпись. Есть два основных типа цифровой подписи:

  • Отделённая — содержимое подписи хранится в отдельном файле от подписываемого;
  • Внедрённая — подписываемое сообщение и сама подпись хранятся в одном файле.
Читайте также:  Linux - простыми словами

Создание отделённой подписи:

$ 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]

Расшифровываются такие сообщения так же, как и просто зашифрованные.

Если есть вопросы задавайте их в комментариях. Понравилась статья? Расскажите о ней друзьям в социальных сетях.