Некогда по работе пришлось разбираться с работой GnuPG и описывать принципы работы с ней для сотрудников. Ниже приведён текст краткого howto, написанного мной.
Для чего всё это надо?
GNU Privacy Guard, GnuPG, GPG — свободная альтернатива набору криптографического ПО PGP, выпущенная под лицензией GPL. Является частью проекта GNU, получила гранты от Германского правительства. GnuPG полностью совместим со стандартом IETF OpenPGP. Текущие версии GnuPG могут взаимодействовать с PGP и другими OpenPGP-совместимыми системами в режиме совместимости. GnuPG позволяет шифровать и подписывать данные в целях безопасного хранения и передачи информации.
Какие особенности GnuPG по сравнению с PGP/OpenPGP?
GnuPG обладает следующими особенностями:
Каков принцип работы GnuPG?
GnuPG шифрует сообщения, используя асимметричные пары ключей, генерируемые пользователями GnuPG. Публичными ключами можно обмениваться с другими пользователями различными путями, в том числе и через интернет с помощью серверов ключей. Также GnuPG позволяет добавлять криптографическую цифровую подпись к сообщению, при этом целостность и отправитель сообщения могут быть проверены.
GnuPG не использует запатентованное или иначе ограниченное ПО и/или алгоритмы, включая алгоритм IDEA, который представлен в PGP почти с самого начала. GnuPG использует другие непатентованные алгоритмы CAST5, 3DES, AES, Blowfish и Twofish. Тем не менее, возможно использование в GnuPG и алгоритма IDEA с помощью дополнительного модуля.
GnuPG — это гибридное криптографическое программное обеспечение, которое использует комбинацию стандартного шифрования с помощью симметричных ключей и шифрования с публичным ключом для безопасного обмена ключами, публичный ключ получателя необходим для шифрования ключа сессии, используемого единожды. Такой режим работы является частью стандарта OpenPGP и частью PGP в его первой версии.
Как работать с утилитой gpg?
Утилита gpg доступна из командной строки, поэтому большую часть криптографических функций можно осуществлять, вызывая её из других программ. К таким функциям относятся, например, шифрование, дешифрование, проверка цифровых подписей. Однако, некоторые операции производятся в интерактивном режиме, например редактирование и создание ключей.
При работе с утилитой необходимо начать с создания своих ключей или импорта чужих открытых ключей (public keys). Далее, имея необходимые ключи, можно осуществлять шифрование/дешифрование данных и добавление электронной цифровой подписи (ЭЦП), позволяющей удостовериться, что данные действительно принадлежат отправителю.
Как создать свой ключ?
Для создания собственного ключа необходимо использовать команду:
gpg --gen-key |
Пример работы команды:
sadko@sadovnikov:~/.ssh> gpg --gen-key gpg (GnuPG) 1.4.5; Copyright (C) 2006 Free Software Foundation, Inc. This program comes with ABSOLUTELY NO WARRANTY. This is free software, and you are welcome to redistribute it under certain conditions. See the file COPYING for details. Please select what kind of key you want: (1) DSA and Elgamal (default) (2) DSA (sign only) (5) RSA (sign only) Your selection? 5 RSA keys may be between 1024 and 4096 bits long. What keysize do you want? (2048) Requested keysize is 2048 bits 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) 0 Key does not expire at all Is this correct? (y/N) y You need a user ID to identify your key; the software constructs the user ID from the Real Name, Comment and Email Address in this form: "Heinrich Heine (Der Dichter) <heinrichh@duesseldorf.de>" Real name: Vladimir Sadovnikov Email address: sadovnikov@protei.ru Comment: PERL Developer You selected this USER-ID: "Vladimir Sadovnikov (PERL Developer) <sadovnikov@protei.ru>" Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? O You need a Passphrase to protect your secret key. Enter passphrase: Confirm passphrase: 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. Not enough random bytes available. Please do some other work to give the OS a chance to collect more entropy! (Need 284 more bytes) ..........+++++ +++++ gpg: key F3F4743F 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/F3F4743F 2008-07-28 Key fingerprint = 6D16 A862 4CC8 487D E388 3235 DD5C 5A35 F3F4 743F uid Vladimir Sadovnikov (PERL Developer) <sadovnikov@protei.ru> Note that this key cannot be used for encryption. You may want to use the command "--edit-key" to generate a subkey for this purpose. |
В данном примере были созданы открытый (public key) и закрытый ключи (private key) для алгоритма шифрования RSA длиной 2048 бит, защищённые паролем. Эти ключи будут использоваться для добавления ЭЦП. Владелец этих ключей — пользователь с идентификатором Vladimir Sadovnikov. Однако, шифровать данные при помощи этих ключей не получится. Поэтому надо к этим ключам создать ещё пару ключей для шифрования. Это делается при помощи консольной команды:
gpg --edit-key user-id |
В интерактивном режиме можно при помощи команды trust задать критерий доверия ключу, а при помощи команды addkey создать пару ключей для шифрования данных.
Пример работы команды:
sadko@sadovnikov:~/.ssh> gpg --edit-key "Vladimir Sadovnikov" gpg (GnuPG) 1.4.5; Copyright (C) 2006 Free Software Foundation, Inc. This program comes with ABSOLUTELY NO WARRANTY. This is free software, and you are welcome to redistribute it under certain conditions. See the file COPYING for details. Secret key is available. pub 2048R/F3F4743F created: 2008-07-28 expires: never usage: SC trust: ultimate validity: ultimate [ultimate] (1). Vladimir Sadovnikov (PERL Developer) <sadovnikov@protei.ru> Command> trust pub 2048R/F3F4743F created: 2008-07-28 expires: never usage: SC trust: ultimate validity: ultimate [ultimate] (1). Vladimir Sadovnikov (PERL Developer) <sadovnikov@protei.ru> 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 2048R/F3F4743F created: 2008-07-28 expires: never usage: SC trust: ultimate validity: ultimate [ultimate] (1). Vladimir Sadovnikov (PERL Developer) <sadovnikov@protei.ru> Command> addkey Key is protected. You need a passphrase to unlock the secret key for user: "Vladimir Sadovnikov (PERL Developer) <sadovnikov@protei.ru>" 2048-bit RSA key, ID F3F4743F, created 2008-07-28 Enter passphrase: Please select what kind of key you want: (2) DSA (sign only) (4) Elgamal (encrypt only) (5) RSA (sign only) (6) RSA (encrypt only) Your selection? 6 RSA keys may be between 1024 and 4096 bits long. What keysize do you want? (2048) Requested keysize is 2048 bits 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) 0 Key does not expire at all Is this correct? (y/N) y Really create? (y/N) y 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. ............+++++ ........+++++ pub 2048R/F3F4743F created: 2008-07-28 expires: never usage: SC trust: ultimate validity: ultimate sub 2048R/EBD472E7 created: 2008-07-28 expires: never usage: E [ultimate] (1). Vladimir Sadovnikov (PERL Developer) <sadovnikov@protei.ru> Command> quit Save changes? (y/N) y |
Для ключей к ЭЦП пользователя Vladimir Sadovnikov создаётся пара ключей RSA длиной 2048 бит. Эти ключи уже можно использовать для шифрования данных.
Как можно посмотреть доступные ключи?
Для просмотра открытых ключей можно воспользоваться командой:
gpg --list-keys user_id |
Пример:
sadko@sadovnikov:~/.ssh> gpg --list-keys 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 /home/sadko/.gnupg/pubring.gpg ------------------------------ pub 2048R/F3F4743F 2008-07-28 uid Vladimir Sadovnikov (PERL Developer) <sadovnikov@protei.ru> sub 2048R/EBD472E7 2008-07-28 |
Просмотр закрытых ключей можно также сделать командой:
gpg --list-secret-keys user_id |
Пример:
sadko@sadovnikov:~/.ssh> gpg --list-secret-keys /home/sadko/.gnupg/secring.gpg ------------------------------ sec 2048R/F3F4743F 2008-07-28 uid Vladimir Sadovnikov (PERL Developer) <sadovnikov@protei.ru> ssb 2048R/EBD472E7 2008-07-28 |
Для просмотра «отпечатов пальцев» используется команда:
gpg --fingerprint user_id |
Пример:
sadko@sadovnikov:~> gpg --fingerprint /home/sadko/.gnupg/pubring.gpg ------------------------------ pub 2048R/F3F4743F 2008-07-28 Key fingerprint = 6D16 A862 4CC8 487D E388 3235 DD5C 5A35 F3F4 743F uid Vladimir Sadovnikov (PERL Developer) <sadovnikov@protei.ru> sub 2048R/EBD472E7 2008-07-28 |
Команда выводит аналогичный результат, что и —list-keys, но с полем Key fingerprint.