Шифруемся GPG

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

Область применения

GnuPG (далее GPG) свободное криптографическое программное обеспечение. Это значит, что оно не содержит запатентованных алгоритмов и использует открытые стандарты. Умеет:

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

Очень упрощённый принцип работы

В самом простом случае, можно представить, что у меня есть коробочка с автоматическим замком и ключ от неё. Я её отправляю своему другу, а ключ остаётся у меня. Таким образом, коробочка — открытый (публичный) ключ. Мой товарищ кладёт в эту коробочку файл и захлопывает крышку, автоматический замок закрывается. С этого момента коробочку могу открыть только я, потому что только у меня есть ключ. Его называют секретным или закрытым ключом. Ключи генерируются или импортируются в локальную базу GPG и хранятся примерно в таком виде:

Главный ключ 1
Подчиненный 1.1
Подчиненный 1.2
Подчиненный 1.3
Главный ключ 2
Подчиненный 2.1
Подчиненный 2.2
Подчиненный 2.3

Генерация ключа

Для генерации ключа вводим в терминал команду:

gpg --gen-key

gpg (GnuPG) 1.4.11; Copyright (C) 2010 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.

Выберите тип ключа:
(1) RSA and RSA (default)
(2) DSA and Elgamal
(3) DSA (только для подписи)
(4) RSA (только для подписи)
Ваш выбор (?-подробнее)?

Здесь нам предлагают несколько вариантов. RSA, DSA, Elgamal это асимметричные алгоритмы шифрования. Асимметричность заключается в том, что шифрование производится с помощью открытого ключа, а расшифровка с помощью секретного. Благодаря некоторым «пробелам» в математике, зная открытый ключ, нельзя вычислить секретный. Однако, с помощью перебора существует возможность расшифровать данные. Цена такой операции, на сегодняшний день, будет значительно превышать цену данных, которые были зашифрованы. Вернёмся к алгоритмам. Каждые из них имеет своё предназначение. Например, DSA предназначен для подписи. Алгоритм RSA может использоваться для подписи и шифрования данных. Есть различия в размере ключа. Чем больше длина ключа, тем устойчивее от взлома. У каждого есть свои преимущества, например, алгоритмы DSA и RSA одинаково неплохо справляются с формированием подписи, но при её проверке RSA справляется быстрее. Если нет особых предпочтений, для начинающего параноика можно смело выбрать (4) RSA (только для подписи).

Ваш выбор (?-подробнее)? 4
ключи RSA могут иметь длину от 1024 до 4096 бит.
Какой размер ключа Вам необходим? (2048)

Если располагаете хорошими лекарствами и уже несколько дней не выходят на связь гости из соседней галактики, чтобы предупредить Вас о надвигающейся опасности, то выбор можно оставить по умолчанию — 2048 бит.
Далее программа обязательно спросит про срок действия ключа. Тут важно понимать, что срок действия ключа потом можно будет изменить. Как — чуть ниже. Срок действия для главного ключа можно выбрать довольно большой 15 — 30 лет или даже бессрочный. После того как мы определимся со сроком, GPG попросит нас заполнить информацию о себе. Имеет смысл, подойти к данному вопросу серьёзно и заполнить латинскими буквами реальные данные. Комментарий можно пропустить или ввести некоторые данные о ключе — они будут отображаться в круглых скобках после имени, так:

Ваше настоящее имя: Charles Robert Darwin
Email-адрес: Darwin@earth.com
Комментарий: key for e-mail sign
Вы выбрали следующий User ID:
"Charles Robert Darwin (key for e-mail sign)
"

Мы создали ключик для RSA только для подписи. Мы можем просмотреть его командой:

gpg --list-key

pub 2048R/76122C20 2012-02-13 [годен до: 2014-02-12]
uid Charles Robert Darwin (key for e-mail sign)

Первые цифры 2048R — число битов в ключе. Цифры 76122C20 — идентификатор ключа или далее просто ID ключа. Вместо него, как правило, можно вводить e-mail. Буква pub говорит о том, что ключ публичный. Секретные ключи здесь не отображаются. Когда мы создадим подчинённый ключик, перед ним будет красоваться надпись sub. Вот и создаём теперь его — подчинённый ключик для шифрования:

gpg --edit-key ID ключа или e-mail

addkey

Вводим пароль, который придумали, когда создавали главный ключ и выбираем (6) RSA (только для шифрования). При создании подчинённого ключа нужно будет определиться только со сроком действия. Его рекомендуется сделать поменьше, чем у главного ключа — 2-3 года, но это вовсе не значит, что прямо так и надо сделать. Удаление ключей производится начиная с секретного:

gpg --delete-secret-keys ID ключа или e-mail
gpg --delete-keys ID ключа или e-mail

Посмотреть созданные ключи можно командой:

gpg --list-key

Изменение срока действия ключа GPG

gpg --edit-key ID ключа или e-mail

Если выбран подключ, то будет изменён срок его действия. Выбирается он в режиме редактирования командой key. Для первого подключа команда будет выглядеть так:

key 1

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

expire

Если вы уже разослали (опубликовали) свой открытый ключ, то могут возникнуть сложности при получении изменений информации всеми остальными.

Резервная копия ключа и сертификат отзыва

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

gpg --export-secret-keys -a ID ключа или e-mail

gpg --export -a ID ключа или e-mail

Соответственно нужно скопировать всё, от ——BEGIN PGP PUBLIC KEY BLOCK—-- и до ——END PGP PUBLIC KEY BLOCK——, включительно. Для секретного ключа, в заголовке вместо PUBLIC, будет PRIVAT. Текстовые файлы нужно замысловато обозвать и спрятать, конечно же не на жёстком диске компьютера, а на каком-нибудь съёмном носителе.

gpg --output revoke.asc --gen-revoke ID ключа или e-mail

Создаст сертификат отзыва. Он рассылается корреспондентам, если ключ утерян. Перед формированием файла будет выведен запрос на указание причины создания сертификата. Можно написать, что вы потеряли свой ключ и он больше не действителен, но латиницей. Сертификат отзыва тоже нельзя хранить на жестом диске и нужно съесть спрятать. Ещё сертификат можно сделать так:

gpg --gen-revoke e-mail

Содержимое вывода сохраняется в текстовом файле с названием вроде lostkey-revoke-certificate.gpg и прячется. Когда потребуется им воспользоваться, корреспонденты должны будут импортировать сертификат, как обычный ключ:

gpg --import lostkey-revoke-certificate.gpg

Обмен ключами через сервер ключей

Свой открытый ключ можно разместить у себя на веб-странице. Можно обмениваться ключами через электронную почту и с помощью сервера ключей. Самым безопасными вариантом считается передача открытого ключа из рук в руки. Серверы ключей предоставляют наиболее удобный способ обмена ключами. Их существует множество и они обмениваются между собой данными, поэтому выбирать можно любой. Для того чтобы отправить открытый ключ на сервер ключей subkeys.pgp.net.

gpg --send-key --keyserver subkeys.pgp.net ID ключа или e-mail

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

gpg --send-key ID ключа или e-mail

Часто встречается рекомендация отправлять ключи на сервер через анонимную сеть TOR. Можно настроить Privoxy на прием пакетов по адресу 127.0.0.1:8118 и отправить ключ командой:

gpg --keyserver server_name –-keyserver-options http-proxy=127.0.0.1:8118 --send-keys ID ключа

Искать ключи на сервере можно как по e-mail, так и по ID ключа:

gpg --search-keys --keyserver subkeys.pgp.net e-mail

gpg --search-keys --keyserver subkeys.pgp.net ID ключа или e-mail

gpg --search-keys ID ключа

Если точно известен уникальный идентификатор ключа, то можно импортировать ключ сразу с сервера так:

gpg --recv-key --keyserver subkeys.pgp.net ID-ключа

Другие способы обмена ключами

Обмениваться ключами можно из рук в руки. Для выгрузки ключа в текстовом виде (опция -a) используется команда:

gpg --export -a ID ключа

Чтобы экспортировать ключ в бинарном виде:

gpg --output file_name.k --export ID ключа или e-mail

После того, как открытый ключ передан, корреспондент должен импортировать ключ:

gpg --import /путь/file_name.k

Проверка отпечатка ключа

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

gpg --fingerprint ID ключа или e-mail

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

Установка доверия и сети доверия

Рассмотрим импорт чужого открытого ключа. Мы импортировали ключ, сверили отпечаток. Теперь, чтобы полноценно и правильно использовать открытый ключ, необходимо подписать его и назначить доверие. Под доверием будем понимать достоверность ключа. Можно снабжать ключи локальной подписью или общедоступной. Для этого используются команды sign или lsign. Локальная подпись будет иметь значение только для нас, а на общедоступную могут опираться другие корреспонденты. Чтобы посмотреть другие подписи на ключе, нужно воспользоваться командой:

gpg --list-sigs ID ключа

Если среди подписей присутствуют подписи людей, которым вы доверяете, то можно полагать, что и ключ достоверен. Тут уже под доверием мы понимаем доверие к владельцу ключа.

Общедоступная (экспортируемая) подпись

Начнём с общедоступной подписи:

gpg --sign-key ID ключа

Если секретных ключей несколько, то необходимо выбрать, каким именно подписывать.

gpg --default-key ID-ключа или e-mail --sign-key ID-ключа или e-mail

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

Локальная подпись

Для создания локальной подписи используется опция —lsign-key. В остальном команда аналогична той, что мы использовали для создания общедоступной подписи. Локальная подпись не может использоваться другими для определения доверия к ключу. Ещё один способ, прикрутить подпись:

gpg --edit-key ID-ключа или e-mail
uid n

где n, того идентификатора, который нужно подписать

lsign

Установка доверия

gpg --edit-key ID-ключа или e-mail

trust

Из предложенных вариантов, выбираем степень доверия.

Асимметричное шифрование файлов

Зашифровать файл можно как для самого себя, так и для кого-либо, если указать
идентификатор (e-mail или ID ключа) другого человека. Можно одним разом зашифровать файлы для нескольких людей, в том числе и для себя.

gpg -e /путь/file_name

Программа попросит ввести текущих получателей, вы должны
ввести ID ключа получателя файла (или просто e-mail получателя).
Если после параметра -e вы поставить -a, то программа сделает зашифрованный файл в кодировке ASCII, расшифрование файла в этом случае производится той же командой.

Расшифрование файла, зашифрованного с помощью ключа

gpg -o /путь/file_name --decrypt /путь/file_name.gpg

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

Ещё можно использовать следующий шабло для шифрования:

gpg --output message.gpg --encrypt --recipient ID ключа или e-mail message.txt

И для расшифрования:

gpg --output message.txt --decrypt message.gpg

Симметричное шифрование

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

-c, —symmetric

gpg -c /путь/file_name - зашифровать файл симметричным алгоритмом;

gpg -o /путь/file_name --decrypt /путь/file_name.gpg — расшифровать зашифрованный файл file_name.gpg

Разновидности подписей

Есть мнение, что электронная цифровая подпись (ЭЦП) имеет существенные преимущества перед обычной подписью. Рассмотрим разновидности и применение электронных подписей, которые нам позволяет реализовать GPG.

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

Для бинарных файлов удобнее использовать отделённую подпись

-b, —detach-sign

gpg -b /путь/file_name

Вы получите файл подписи с расширением sig.

Проверка цифровой подписи:

gpg --verify /путь/file_name.sig /путь/file_name

где file_name.sig — файл подписи, file_name — подписанный файл.

Вы получите отчет о проверке цифровой подписи.

Можно зашифровать файл с автоматической постановкой цифровой
подписи:

-s, —sign

gpg -e -s /путь/file_name

Расшифровка файла с автоматической проверкой цифровой подписи:

gpg -o /путь/file_name --decrypt /путь/file_name.gpg

Используется та же команда, что и для расшифровки файла, при
этом подпись проверяется автоматически.

Возможно зашифровывание файла с автоматической постановкой цифровой
подписи в формате ASCII:

gpg -e -s -a /путь/file_name

Получим файл с именем file_name.asc

Расшифровка с проверкой цифровой подписи:

gpg -o /путь/file_name --decrypt /путь/file_name.asc

Прозрачная подпись

Удобна при подписывании текстовых документов. При
этом вы получите новый файл с добавленным расширением asc.

Цифровая подпись в формате ASCII будет добавлена в конец текста подписываемого текста файла.

gpg --clearsign /путь/file_name

Проверка прозрачной подписи

gpg --verify /путь/name.asc

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

Что делать, если Windows?

Для пользователей MS Windows существует проект GPG4WIN.

Команды будут вводится так:

«c:\Program Files\GNU\GnuPG\gpg.exe» —edit-key ID ключа

Чтобы облегчить ввод, можно перейти в папку с GPG:

cd «c:\Program Files\GNU\GnuPG\»

3 Comments

  1. klnm:

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

    Всё шифрование и расшифровка происходит прозрачно и незаметно для пользователя. При шифрованном общении горит замочек.

    Единственное, надо импортировать открытые ключи собеседников, но при использовании сервера ключей это тоже сделать нертудно.

    Причём, связка psi.exe+gpg.exe под виндой работает полностью аналогично.

  2. klnm:

    Помнится ещё, под виндой была оконная утилитка с кнопками «генерировать ключ», «зашифровать», «расшифровать» итп для чайников. wingpg чтоли называлась. Под никсы нет ничего такого?

Leave a Reply

*