1. Быстрый старт

Генерация новой пары ключей
Обмен ключами
Зашифрование и расшифрование документов
Подписи и их проверка

GnuPG - инструмент для защиты коммуникаций. Эта глава коротко описывает основы работы с GnuPG, включая создание пар ключей, обмен ключами и их проверку, зашифровку и расшифровку документов, заверение документов цифровой подписью. Она не описывает в деталях принципы криптографии с открытым ключом, шифрования и цифровых подписей. Эти вопросы рассматриваются в главе 2. Здесь, также, не рассматриваются тонкости использования GnuPG. Эти вопросы рассматриваются в главах 3 и 4.

GnuPG использует криптографию с открытым ключом. Каждый пользователь имеет пару ключей (keypair), состоящую из секретного (private) и открытого (public) ключей. Секретный ключ является секретом пользователя и не может быть передан другому лицу, ни при каких обстоятельствах. Открытый ключ передается всем людям, с которыми пользователь будет обмениваться сообщениями. GnuPG использует несколько более хитроумную схему, при которой пользователь имеет первичную пару ключей и, возможно, дополнительно несколько подчиненных. Первичная и подчиненные пары объединены, для упрощения их использования, и эта связка, зачастую, может рассматриваться просто, как одна пара ключей.

Генерация новой пары ключей

Для создания первичной пары ключей используется команда --gen-key

alice% gpg --gen-key
gpg (GnuPG) 0.9.4; Copyright (C) 1999 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)
   (4) ElGamal (sign and encrypt)
Your selection?
GnuPG может создавать несколько разных типов ключей, но первичный ключ должен быть пригоден для создания подписи (signature). Поэтому есть только три варианта. Вариант 1 создает две пары ключей. DSA - первичная, используемая только для подписи. ElGamal - подчиненная, используемая для шифрования. Вариант 2 похож, но создает только пару DSA. Вариант 4[1] создает только пару ElGamal, используемую и для подписи и для шифрования. В любом случае, позже можно создать дополнительные пары ключей для подписи и шифрования. Большинству пользователей подойдет вариант 1.

Также Вы должны выбрать размер ключа. Размер ключа DSA должен быть между 512 и 1024 бит. Ключ ElGamal может быть любого размера. Обычно, GnuPG требует ключи не короче 768 бит. Таким образом, если Вы выбрали вариант 1 и размер ключа больше 1024 бит, то ключ ElGamal будет иметь указанный размер, а ключ DSA - 1024 бита.

About to generate a new ELG-E keypair.
              minimum keysize is  768 bits
              default keysize is 1024 bits
    highest suggested keysize is 2048 bits
What keysize do you want? (1024)
Больший размер ключа дает большую защиту от взлома, но размер по умолчанию достаточен практически для любых целей. Большая длина ключа замедляет зашифровку и расшифровку и может отразиться на длине сигнатуры. Размер ключа нельзя будет впоследствии изменить.

Наконец, Вы должны указать срок действия ключа. В случае варианта 1, указанный срок используется для обоих ключей.

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) 
Большинству пользователей подойдет бессрочный ключ. Срок действия следует выбирать с осторожностью; хотя можно изменить срок действия после создания ключа, не исключены проблемы с передачей изменений тем пользователям, у которых уже имеется Ваш открытый ключ.

В дополнение к параметрам ключа, Вы должны указать идентификатор пользователя. Идентификатор нужен, чтобы связать созданный ключ с конкретным лицом.

You need a User-ID to identify your key; the software constructs the user id
from Real Name, Comment and Email Address in this form:
    "Heinrich Heine (Der Dichter) <heinrichh@duesseldorf.de>"

Real name: 
При генерации ключа создается только один идентификатор пользователя, но возможно создание дополнительных идентификаторов, если Вы хотите использовать ключ в нескольких контекстах; например, как инженер на работе и как политический деятель после нее. Идентификатор пользователя не может быть отредактирован после создания.

GnuPG запросит пароль для защиты первичного и подчиненного секретных ключей, которые Вы будете держать в недоступном для других месте.

You need a Passphrase to protect your private key.    

Enter passphrase: 
На длину пароля нет ограничений, и его следует выбирать тщательно. С точки зрения безопасности, пароль для защиты ключа очень важен в GnuPG (и других системах с открытым ключом), т.к. это Ваша единственная защита в случае, если Ваш секретный ключ попадет в чужие руки. Не следует брать слова из БСЭ, чередуйте регистр букв и используйте неалфавитные символы. Хороший пароль критичен для надежности GnuPG.

Создание отзывающего сертификата

После создания пары ключей, Вам следует создать отзывающий сертификат (revokation certificate) для первичного открытого ключа, используя команду --gen-revoke. Если Вы забудете пароль, либо Ваш секретный ключ будет похищен или утерян, этот сертификат может быть разослан для уведомления о том, что открытый ключ нельзя больше использовать. Отозванный открытый ключ может использоваться для проверки сделанных Вами подписей и дальше, но он не может быть использован для зашифровки сообщений для Вас. Также Вы сохраняете возможность расшифровки посланных Вам сообщений, при наличии секретного ключа.

alice% gpg --output revoke.asc --gen-revoke mykey
[...]
Аргумент mykey - идентификатор Вашей первичной пары ключей или любая часть идентификатора пользователя Вашей пары ключей. Сгенерированный сертификат будет сохранен в файле revoke.asc. Если опция --output опущена, результат помещается в стандартный вывод. Вы можете вывести сертификат на принтер и хранить его где-нибудь в надежном месте (банковский сейф подойдет). Если сертификат попадет в чужие руки и будет опубликован, то открытый ключ утратит свое действие.

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

Для общения с кем-либо, вы должны обменяться ключами. Просмотреть список имеющихся открытых ключей, можно используя команду --list-keys.

alice% gpg --list-keys
/users/alice/.gnupg/pubring.gpg
---------------------------------------
pub  1024D/BB7576AC 1999-06-04 Alice (Judge) <alice@cyb.org>
sub  1024g/78E9A8FA 1999-06-04

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

Перед тем как послать открытый ключ кому-либо, Вы должны его экспортировать. Для этого используйте команду --export. Ей требуется, дополнительно, аргумент, идентифицирующий экспортируемый открытый ключ, как и --gen-revoke.

alice% gpg --output alice.gpg --export alice@cyb.org

Ключ экспортируется в двоичном формате, что бывает неудобно. GnuPG имеет опцию командной строки --armor, которая указывает на необходимость вывода в формате ASCII. Практически любой вывод GnuPG, т.е. ключи, зашифрованные документы, подписи, может происходить в формате ASCII.[2]

alice% gpg --armor --export alice@cyb.org
-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: GnuPG v0.9.7 (GNU/Linux)
Comment: For info see http://www.gnupg.org

[...]
-----END PGP PUBLIC KEY BLOCK-----

Импорт открытого ключа

Открытый ключ может быть добавлен к множеству Ваших открытых ключей при помощи команды --import.

alice% gpg --import blake.gpg
gpg: key 9E98BC16: public key imported
gpg: Total number processed: 1
gpg:               imported: 1
alice% gpg --list-keys
/users/alice/.gnupg/pubring.gpg
---------------------------------------
pub  1024D/BB7576AC 1999-06-04 Alice (Judge) <alice@cyb.org>
sub  1024g/78E9A8FA 1999-06-04

pub  1024D/9E98BC16 1999-06-04 Blake (Executioner) <blake@cyb.org>
sub  1024g/5C8CBD41 1999-06-04

Достоверность импортированного ключа должна быть подтверждена. GnuPG использует гибкую и мощную модель проверки подлинности, не требующую, чтобы Вы лично проверяли достоверность каждого импортированного ключа. Тем не менее, достоверность некоторых ключей Вам придется проверить самому. Сначала проверяются отпечатки(fingerprint) ключа, затем он заверяется подписью, для подтверждения того, что ключ достоверен. Отпечатки ключа можно быстро просмотреть командой --fingerprint, но для заверения ключа Вы должны отредактировать его.

alice% gpg --edit-key blake@cyb.org

pub  1024D/9E98BC16  created: 1999-06-04 expires: never      trust: -/q
sub  1024g/5C8CBD41  created: 1999-06-04 expires: never     
(1)  Blake (Executioner) <blake@cyb.org>

Command> fpr
pub  1024D/9E98BC16 1999-06-04 Blake (Executioner) <blake@cyb.org>
             Fingerprint: 268F 448F CCD7 AF34 183E  52D8 9BDE 1A08 9E98 BC16
Отпечатки ключа проверяются его владельцем. Это может быть сделано при личной встрече, по телефону, или любым другим способом, гарантирующим, что Вы общаетесь с владельцем ключа. Если отпечатки полученные Вами совпадают с указанными владельцем ключа, то можете быть уверены, что обладаете достоверной копией ключа.

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

Command> sign
             
pub  1024D/9E98BC16  created: 1999-06-04 expires: never      trust: -/q
             Fingerprint: 268F 448F CCD7 AF34 183E  52D8 9BDE 1A08 9E98 BC16

     Blake (Executioner) <blake@cyb.org>

Are you really sure that you want to sign this key
with your key: "Alice (Judge) <alice@cyb.org>"

Really sign?

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

Command> check
uid  Blake (Executioner) <blake@cyb.org>
sig!       9E98BC16 1999-06-04   [self-signature]
sig!       BB7576AC 1999-06-04   Alice (Judge) <alice@cyb.org>

Зашифрование и расшифрование документов

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

Если Вы хотите послать сообщение другу, то зашифровываете его при помощи открытого ключа друга, а тот расшифровывает его при помощи своего секретного ключа. Если друг захочет Вам ответить, то он зашифрует ответ при помощи Вашего открытого ключа, а Вы расшифруете его своим секретным.

Для зашифрования документа используется команда --encrypt. Вы должны иметь открытые ключи предполагаемых получателей. Программа ожидает в качестве параметра имя шифруемого документа или, в случае его отсутствия, шифрует стандартный ввод. Зашифрованный результат помещается в стандартный вывод, если не указана опция --output. Для повышения защиты документ дополнительно сжимается.

alice% gpg --output doc.gpg --encrypt --recipient blake@cyb.org doc
Опция --recipient используется для каждого получателя и имеет аргумент, идентифицирующий открытый ключ, которым должен быть зашифрован документ. Зашифрованный документ может быть расшифрован только тем, чей секретный ключ соответствует одному из указанных открытых ключей. В частности, Вы не можете расшифровать зашифрованный Вами документ, если не включили свой открытый ключ в список получателей.

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

blake% gpg --output doc --decrypt doc.gpg

You need a passphrase to unlock the secret key for
user: "Blake (Executioner) <blake@cyb.org>"
1024-bit ELG-E key, ID 5C8CBD41, created 1999-06-04 (main key ID 9E98BC16)

Enter passphrase: 

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

alice% gpg --output doc.gpg --symmetric doc
Enter passphrase: 

Подписи и их проверка

Цифровая подпись удостоверяет создателя и дату создания документа. Если документ будет каким-либо образом изменен, то проверка цифровой подписи выдаст ошибку. Цифровая подпись может использоваться в тех же целях, что и обычная подпись. Исходные тексты GnuPG, например, подписаны, и Вы можете убедиться, что они дошли до Вас неизмененными.

Создание и проверка подписей отличается от зашифрования/расшифрования. При подписи документа используется закрытый ключ подписывающего, а проверяется подпись с использованием его открытого ключа. Например, Alice использует свой секретный ключ, чтобы подписать свою новую статью в журнал. Редактор, получив письмо, использует открытый ключ Alice, чтобы проверить, что письмо действительно от Alice и не было изменено за время пересылки.

Для подписи документов используется команда --sign. Документ для подписи на входе и подписанный на выходе.

alice% gpg --output doc.sig --sign doc

You need a passphrase to unlock the private key for
user: "Alice (Judge) <alice@cyb.org>"
1024-bit DSA key, ID BB7576AC, created 1999-06-04

Enter passphrase: 
Документ сжимается перед подписью и выводится в двоичном формате.

Имея подписанный документ, Вы можете либо проверить подпись, либо проверить подпись и восстановить исходный документ. Для проверки подписи используется команда --verify. Для проверки подписи и извлечения документа используется команда --decrypt. Подписанный документ на входе и проверенный и восстановленный на выходе.

blake% gpg --output doc --decrypt doc.sig
gpg: Signature made Fri Jun  4 12:02:38 1999 CDT using DSA key ID BB7576AC
gpg: Good signature from "Alice (Judge) <alice@cyb.org>"

Прозрачно подписанные(Clearsigned) документы

Обычно цифровые подписи применяются при подписи сообщений usenet и e-mail. При этом нежелательно сжимать подписываемые документы. Команда --clearsign добавляет к документу цифровую подпись в формате ASCII, но не изменяет сам документ.

alice% gpg --clearsign doc

You need a passphrase to unlock the secret key for
user: "Alice (Judge) <alice@cyb.org>"
1024-bit DSA key, ID BB7576AC, created 1999-06-04

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

[...]
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v0.9.7 (GNU/Linux)
Comment: For info see http://www.gnupg.org

iEYEARECAAYFAjdYCQoACgkQJ9S6ULt1dqz6IwCfQ7wP6i/i8HhbcOSKF4ELyQB1
oCoAoOuqpRqEzr4kOkQqHRLE/b8/Rw2k
=y6kj
-----END PGP SIGNATURE-----

Отделенная подпись

Применение подписанных документов ограниченно. Получатель должен восстанавливать документ из подписанной версии, и даже в случае прозрачной подписи, подписанный документ должен быть отредактирован для получения оригинала. Поэтому имеется третий метод подписи документов, который создает отделенную подпись (detached signature). Отделенная подпись создается при использовании команды --detach-sign.

alice% gpg --output doc.sig --detach-sign doc

You need a passphrase to unlock the secret key for
user: "Alice (Judge) <alice@cyb.org>"
1024-bit DSA key, ID BB7576AC, created 1999-06-04

Enter passphrase: 

Для проверки подписи необходимы и отделенная подпись, и документ. Для проверки используется команда --verify.

blake% gpg --verify doc.sig doc
gpg: Signature made Fri Jun  4 12:38:46 1999 CDT using DSA key ID BB7576AC
gpg: Good signature from "Alice (Judge) <alice@cyb.org>"

[1]

Вариант 3 генерирует пару ElGamal, которая не пригодна для подписи.

[2]

Многие, часто используемые, опции командной строки могут быть установлены в файле конфигурации.