GnuPG или GPG — конкретная открытая (GPLv3) реализация OpenPGP(стандарт шифрования, описанный в RFC 4880 и RFC 6637)
GnuPG шифрует сообщения, используя асимметричные пары ключей(либо симметричный ключ), генерируемые пользователями GnuPG. Открытыми ключами можно обмениваться с другими пользователями различными путями, в том числе и через Интернет с помощью серверов ключей. Также GnuPG позволяет добавлять криптографическую цифровую подпись к сообщению, при этом целостность и отправитель сообщения могут быть проверены.
GPG позволяет шифровать/дешифровать, подписывать и авторизовывать.
Шифрование в gpg может быть выполнено:
1.Асимметрично(шифруется публичным ключом, расшифровывается приватным)
2.Симметрично(шифруется и расшифровывается приватным ключом, шифруется и расшифровывается одной и той же парольной фразой)
Шифрование можно совмещать с подписыванием файла.
Зашифровать можно одним или более публичными ключами.
1.Проверка наличия установленного gpg бинарника, если нет,то устанавливаем пакет,
который содержит в себе этот бинарник
Ubuntu
1 |
# which gpg1 || (apt-get update && apt-get install gpg) |
Centos
1 |
# which gpg || yum install gnupg2 |
Просмотр установленной версии gpg
1 |
# gpg --version | grep GnuPG |
1 |
gpg (GnuPG) 2.0.22 |
Просмотр существующих ключей
Просмотр наличия публичный ключей
1 |
# gpg -k |
1 |
# gpg --list-keys --keyid-format LONG |
Просмотр наличия приватный ключей
1 |
# gpg -K |
1 |
# gpg --list-secret-keys --keyid-format LONG |
Генерация пары ключей для асимметричного шифрования
Для примера будем и использовать RSA-алгоритм с длиной ключа 2048 бит с бессрочным сроком годности ключа
1 |
# gpg --gen-key |
Вы можете выбрать любой вариант, но учтите, что выбрав третий или четвёртый вариант вы не сможете шифровать сообщения и файлы!
1 2 3 4 5 6 7 8 9 |
gpg (GnuPG) 2.0.22; Copyright (C) 2013 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 (default) (2) DSA and Elgamal (3) DSA (sign only) (4) RSA (sign only) |
1 |
Your selection? 1 |
Для RSA ключа размером 2048 бит вполне достаточно, но вы можете выбрать размер до 4096 бит (использовать ключи размера меньше 2048 бит небезопасно).
Выбор длины ключа в битах 2048 vs 4096
С точки зрения безопасности естественно лучше выбирать тот, который больше. Так как он будет наиболее безопасным. И причем тут зависимость не линейная.
То есть 2048 не в 2 раза безопаснее чем 1024. А во много раз. И так же 4096 во много раз безопаснее чем 2048.
Но при этом сам процесс шифрования и процесс расшифровки требует процессорного времени. И тут тоже большая разница. Каждое увеличение ключа в два раза увеличивает процессорное время примерно в 6-7 раз. Например, если ваш процессор будет расшифровывать rsa1024 одну минуту. То rsa2048 он будет расшифровывать 7 минут. А RSA4096 он уже будет расшифровывать 49 минут.
1 |
RSA keys may be between 1024 and 4096 bits long. |
1 |
What keysize do you want? (2048) |
1 |
Requested keysize is 2048 bits |
Если вы выберете ограниченный срок действия ключа, то по истечению его срока ключ будет признан недействительным. Вы можете продлить срок действия ключа, пока он не истечёт.
Выбираем бессрочный срок годности
1 2 3 4 5 6 |
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 |
1 2 3 |
Key is valid for? (0) Key does not expire at all Is this correct? (y/N) y |
GPG спросит, верно ли мы указали срок, и если да, то нужно будет указать имя, адрес электронной почты и примечание (всё это опционально, но нужно указать хотя бы что-то одно).
1 2 3 4 5 6 7 8 9 |
GnuPG needs to construct a user ID to identify your key. Real name: MySQL User Email address: myname@mydomain.com Comment: Key for MySQL user for encrypt-decrypt mysql backup You selected this USER-ID: "MySQL User (Key for MySQL user for encrypt-decrypt mysql backup) <myname@mydomain.com>" Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? O |
Вводим пароль на приватный ключ
Пароль нужен для защиты вашего ключа, поскольку он хранится в домашней каталоге пользователя.
На тот случай, если злоумышленник получит физический доступ к вашему компьютеру, он не сможет просто воспользоваться вашим приватным ключом — ему сначала нужно будет подобрать пароль.
1 |
You need a Passphrase to protect your secret key. |
На этом этапе ключ генерируется и добавляется в связку ключей.
В связке ключей может находится множество ключей.
Также на этом этапе создаётся сертификат отзыва — файл, с помощью которого созданный ключ можно отозвать (признать недействительным).
Рекомендуется хранить его в безопасном месте, т.к. если к нему получат доступ злоумышленники, то они смогут отозвать ваш ключ.
1 2 3 4 5 6 7 8 |
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. |
Для ускорения генерации случайных байт рекомендуется установить пакет rng-tools(имя пакета одинаково для Ubuntu и Centos)
1 2 3 4 5 6 7 8 9 10 |
gpg: key B2B19548 marked as ultimately trusted public and secret key created and signed. gpg: checking the trustdb gpg: 3 marginal(s) needed, 1 complete(s) needed, PGP trust model gpg: depth: 0 valid: 1 signed: 0 trust: 0-, 0q, 0n, 0m, 0f, 1u pub 2048R/B2B19548 2020-07-27 Key fingerprint = 7C83 5097 16EE DB49 2735 E907 E9AD 5CF2 B2B1 9548 uid MySQL User (Key for MySQL user for encrypt-decrypt mysql backup) <myname@mydomain.com> sub 2048R/B3EB1D0B 2020-07-27 |
Проверяем наличие созданных публичного и приватного ключей
1 |
# gpg -k |
1 2 3 4 5 |
/root/.gnupg/pubring.gpg ------------------------ pub 2048R/B2B19548 2020-07-27 uid MySQL User (Key for MySQL user for encrypt-decrypt mysql backup) <myname@mydomain.com> sub 2048R/B3EB1D0B 2020-07-27 |
1 |
# gpg -K |
1 2 3 4 5 |
/root/.gnupg/secring.gpg ------------------------ sec 2048R/B2B19548 2020-07-27 uid MySQL User (Key for MySQL user for encrypt-decrypt mysql backup) <myname@mydomain.com> ssb 2048R/B3EB1D0B 2020-07-27 |
1 |
# gpg --list-secret-keys --keyid-format LONG |
1 2 3 4 5 |
/root/.gnupg/secring.gpg ------------------------ sec 2048R/E9AD5CF2B2B19548 2020-07-27 uid MySQL User (Key for MySQL user for encrypt-decrypt mysql backup) <myname@mydomain.com> ssb 2048R/6668A008B3EB1D0B 2020-07-27 |
1 |
# gpg --list-keys --keyid-format LONG |
1 2 3 4 5 |
/root/.gnupg/pubring.gpg ------------------------ pub 2048R/E9AD5CF2B2B19548 2020-07-27 uid MySQL User (Key for MySQL user for encrypt-decrypt mysql backup) <myname@mydomain.com> sub 2048R/6668A008B3EB1D0B 2020-07-27 |
Описание полей в созданных ключах:
Для приватного ключа
1 2 |
sec - это primary часть приватного ключа ssb - это secondary/subkey часть приватного ключа |
Для публичного ключа
1 2 |
pub- это primary часть публичного ключа sub - это secondary/subkey часть публичного ключа |
Для обоих ключей
1 |
2048R |
– алгоритм шифрования(R-RSA) и количество бит(2048)
1 |
B2B19548 |
– иденитификатор ключа,(точнее последняя его часть, полный идентификатор ключа доступен по командам)
1 2 |
gpg --list-secret-keys --keyid-format LONG gpg --list-keys --keyid-format LONG |
1 |
B3EB1D0B |
— аналогично, но часть идентификатора подключа
1 |
2020-07-27 |
– дата создания ключа
Поле expires не указано, значит ключ был создан без истечения срока давности/годности
1 2 3 4 |
uid - идентификатор пользователя MySQL User - имя пользователя, на которого был создан ключ Key for MySQL user for encrypt-decrypt mysql backup - примечание к ключу myname@mydomain.com - эл.ящик пользователя |
Просмотр отпечатка(fingerprint) ключа
1 |
# gpg --fingerprint myname@mydomain.com |
1 2 3 4 |
pub 2048R/B2B19548 2020-07-27 Key fingerprint = 7C83 5097 16EE DB49 2735 E907 E9AD 5CF2 B2B1 9548 uid MySQL User (Key for MySQL user for encrypt-decrypt mysql backup) <myname@mydomain.com> sub 2048R/B3EB1D0B 2020-07-27 |
Fingerprint используется в основном для верификация публичного ключа(например, для проверки того, что с сервера ключей был импортирован действительно правильный публичный ключ)
Также отпечаток может выполнять функцию идентификатора ключа — то есть вместо указания имени пользователя (в данном случае MySQL User) можно использовать отпечаток.
Расположения gpg-ключей на файловой системе
Все gpg-ключи и конфигурация gpg хранится в каталоге .gnupg в домашем каталоге пользователя
1 |
# ls -ltr ~/.gnupg/ |
1 2 3 4 5 6 7 8 9 |
total 32 -rw------- 1 root root 7680 Dec 4 2019 gpg.conf drwx------ 2 root root 4096 Jul 27 20:14 private-keys-v1.d srwxr-xr-x 1 root root 0 Jul 27 20:14 S.gpg-agent -rw------- 1 root root 2555 Jul 27 20:18 secring.gpg -rw------- 1 root root 1253 Jul 27 20:18 pubring.gpg~ -rw------- 1 root root 1253 Jul 27 20:18 pubring.gpg -rw------- 1 root root 1280 Jul 27 20:18 trustdb.gpg -rw------- 1 root root 600 Jul 27 20:18 random_seed |
1 2 3 |
gpg.conf - файл конфиругации secring.gpg - секретная часть ключей pubring.gpg - приватная часть ключей |
Подписывание файлов
Для подписи файла используется приватный ключ. Поскольку приватный (секретный) ключ хранится (очевидно же) в секрете владельцем, то исходя из предположения, что никто кроме владельца не имеет доступ к приватному ключу, мы можем быть уверены, что файл, который подписан этим приватным ключом, исходит от этого определённого лица. Если файл как либо после подписи был изменён, то эта подпись перестаёт быть верной (валидной) для данного файла. Поэтому, проверка подписи позволяет гарантировать:
— файл исходит от того лица, которое её подписало;
— файл не был как либо модифицирован с момента подписи.
Для проверки подписи определённого лица у вас должен быть публичный ключ этого лица.
Подписываем тестовый файл
Подпись при этом сохраняется вместе с сообщением.
1 |
# cat 1.txt |
1 2 |
123 test |
Подписывание в ASCII-формате(текстовый формат, позволяющий передавать содержимое полученного файла сообщением, по почте и т.д в читабельном виде)
1 |
# gpg --clearsign 1.txt |
Либо
1 |
# gpg --clearsign 1.txt > 1.txt.asc |
И провеярем его содержимое
1 |
# cat 1.txt.asc |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 123 test -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.22 (GNU/Linux) iQEcBAEBAgAGBQJfHwz2AAoJEOmtXPKysZVI/14H/3W4RukjpoWn9qYrnO0XE4kP Ygiz1giPj2A+IBCYlTiM8nMCDdQKnLHJgPQJGUZml6TWh1HtRK793hoIgQuHvKNv FWWmeEJE3HiLexYNeATLht5iSM8zLG3QU0nuE5L12Z4vRYZslLXpoL91Vlk9DeEf 9HMJLFxeW6OA2QfaV3no6dOLnuxDee2+HsY2PF1TwbKqeC7fg+KiOYWVDhnDzw2i I1LQY5B6Fqyp4wodWFZkCFD+UI/rgc3E+2DrA8oaHvhRxVdakg7fIUMfB1Y/OkX6 Z6mTgeYgZlXsJB2DN6nPsutDbz6xTbP0yRdy144OXTX7tEc6afibLCsZ6aTPm9Q= =VsFx -----END PGP SIGNATURE----- |
Подписывание файла с созданием файла в бинарном формате
1 |
# gpg -s 1.txt |
Будет создан файл 1.txt.gpg, который включает и исходный файл, и его цифровую подпись.
Новый файл в бинарном формате — то есть даже если ранее это было сообщение или текстовый файл, то он становится нечитаемым.
Если на компьютере имеется только один приватный ключ, то он будет выбран автоматически.
Если на компьютере несколько приватных ключей, то нужно использовать также опцию -u ИМЯ или её более длинный вариант —local-user ИМЯ.
1 |
# gpg -u 'MySQL User' -s 1.txt |
Цифровая подпись может быть интегрирована в файл,
а может содержаться в отдельном файле
Для создания отдельного файла с цифровой подписью(вместо интеграции такой подписи в файл с данными)
можно использовать опцию -b (—detach-sign)
1 |
# gpg -u 'MySQL User' -b 5.txt |
Будет создан дополнительный файл .sig (в данном случае 5.txt.sig).
В этом файле нет ничего, кроме цифровой подписи.
Поэтому нужно предоставлять и оригинальный файл, и файл .sig.
Проверка подписи:
Проверка подпись, которая интегрирована в файл с данными (используем опцию —verify)
1 |
# gpg --verify 1.txt.asc |
1 2 |
gpg: Signature made Thu 27 Jul 2020 02:09:14 PM EEST using RSA key ID B2B19548 gpg: Good signature from "MySQL User (Key for MySQL user for encrypt-decrypt mysql backup) <myname@mydomain.com>" |
Если цифровая подпись отделена от файла, то после опции —verify нужно указать два аргумента:
вначале идёт файл с подписью, а затем подписанные данные:
1 |
# gpg --verify 5.txt.sig 5.txt |
Извлечение файла из подписанного файла .gpg
1 |
# gpg -d -u 'MySQL User' -o 6-ready.txt 6.txt.gpg |
Шифрование/расшифрование файла
Зашифруем новый тестовый файл
1 |
# cp 1.txt 2.txt |
1 |
# gpg -e -r 'MySQL User' 2.txt |
По умолчанию шифруется в бинарном формате
1 |
# cat 2.txt.gpg |
1 2 3 |
� fh�� ���ڬDz���eR� |
Выполним шифрование в ASCII-текстовом формате(используем опцию -a или —armor )
1 |
# gpg -e --armor 2.txt |
1 |
# cat 2.txt.asc |
1 2 3 4 5 6 7 8 9 10 11 12 13 |
-----BEGIN PGP MESSAGE----- Version: GnuPG v2.0.22 (GNU/Linux) hQEMA2ZooAiz6x0LAQf+MwJTW7JBWP0xjd/aWMEpxh7gTxm3Ax0feXpextcm6ZCq e/GQLm3lDMfpcyCsUMad2Tb29lNsAmsdPCsFxzsZEkQ6yNANVoOe9WABAatIeD2a L65upq0clEBB5pvuSA3as4UYVFMPCPFC4i89KlkrrI3VG1lUkdhwpljhF73LiUxg /DlnnmOTd3iH/KuumzFz1rJczBji2iVW4LVZof4YJxPqKIgT8U71ANoqVZm3q1KB xkSHSFkOWYPxOxGPI7UzWky39Iu7bhahPGnaWbbqWC+1e20Qxl01/r97d1AuYLNR 7Pc4DjqprmJMFfHUJTSCLxfbAK0m+VLUYbJJlIBqqNJJAQ4tDK0Nd8pNGEbxr01I nCsOl4WffK6hOGEcA/z3hlakkqNXmjm/o0/CZ30KO9NUF1oadPKOTb0R01OZiiFD v3qBUwavpdabiA== =iSuw -----END PGP MESSAGE----- |
Раcшифровка файла зашифрованногов формате ASCI
1 |
# gpg -d 2.txt.asc > 2-decrypt-asci.txt |
Либо
1 |
# gpg -d -o 2-decrypt-asci.txt 2.txt.asc |
Раcшифровка файла зашифрованного, в бинарном формате
1 |
# gpg -d 2.txt.gpg > 2-decrypt-bin.txt |
Либо
1 |
# gpg -d -o 2-decrypt-bin.txt 2.txt.gpg |
1 |
# cat 2-decrypt-asci.txt |
1 2 |
123 test |
1 |
# cat 2-decrypt-bin.txt |
1 2 |
123 test |
т.к. у нас только одна пара ключей,то она автоматически/по умолчанию и используется для шифрования/расшифрования
Если таких пар несколько, тогда при выполнении шифрования/расшифрования указываем одно из значений
идентификатор пользователя(имя или email), идентификатор ключа, отпечаток ключа, которое было задано при генерировании ключа
Например, зашифруем и расшифруем файл с помощью идентификатора пользователя ‘MySQL User’
1 |
# gpg -e -r 'MySQL User' --armor -o 3.txt.asc 3.txt |
1 |
# gpg -d -r 'MySQL User' -o 3-descryp.txt 3.txt.asc |
Экспорт/импорт ключей
Экспорт публичного ключа в текстовом виде
1 |
# gpg --armor --output pubkey.txt --export B2B19548 |
Экспорт приватного ключа в текстовом виде
Если при создании пары ключей был установлен пароль на приватный ключ,тогда
этот пароль будет запрошен при экспорте/импорте этого приватного ключа
1 |
# gpg --armor --output privkey.txt --export-secret-keys B2B19548 |
Импорт публичного ключа
1 |
# gpg --import pubkey.txt |
Импорт приватного ключа
1 |
# gpg --allow-secret-key-import --import privkey.txt |
Редактирования ключей GPG
1 |
# gpg --edit-key иденитификатор ключа|Fingeprint|recipient |
Например
1 |
# gpg --edit-key B2B19548 |
1 |
# gpg --edit-key 7C83509716EEDB492735E907E9AD5CF2B2B19548 |
1 |
# gpg --edit-key 'MySQL User' |
Получение списка доступных команд в оболочке gpg
1 |
gpg> ? |
Например, необходимо изменить или установить пароль на приватный ключ
Выполняем команду passwd
1 |
gpg> passwd |
После чего вводим текущий пароль,если он был установлен,а затем новый пароль и его подтверждение
Удаление ключей
Для удаление публичного ключа сначало необходимо удалить приватный ключ
1 |
# gpg --delete-secret-key 'MySQL User' |
Затем удалить публичный ключ
1 |
# gpg --delete-key 'MySQL User' |
Сервер ключей
Сервер ключей — это специальный сервер, хранящий публичные ключи.
Сервера ключей используются для распространения/обмена публичных/ми ключей/ами
Тема сервера ключей в этой статье не рассматривается
Источник:
https://hackware.ru/?p=8215
https://habr.com/ru/post/358182
https://eax.me/gpg
https://devpew.com/blog/gpg