Kleopatra: GnuPG в графической оболочке
Программы семейства GPG (GNU Privacy Guard) / PGP (Pretty Good Privacy) позволяют «прозрачно» подписывать и зашифровывать все типы цифровой информации. По своей сути, названные инструменты являются лишь удобной обёрткой, упрощающей практическое использование открытых алгоритмов асимметричной криптографии.
Несколько лет ведется полемика об актуальности использования GPG, в рамках которой высказывается много скептицизма о громоздкости и устаревании этого криптографического продукта. Высокий порог вхождения очевиден при соответствующем поисковом запросе, который выдает много сложной информации и инструкции по работе с утилитой GPG в терминале Linux.
В этой статье рассмотрим приложение с открытым исходным кодом для работы с инструментарием GPG в графической оболочке — находка для новичков и тех, кто просто избегает загадочного черного окна командной строки. Благодаря кроссплатформенности Клеопатры, статья одинаково полезна для пользователей Windows, Linux и FreeBSD.
Установка
Во многих unix-like операционных системах Клеопатра имеется в репозиториях по умолчанию. В Debian установка выглядит так: sudo apt-get install kleopatra .
Для Windows программа распространяется в пакете GPG4Win, объединяющем в себе несколько полезных инструментов: непосредственно Kleopatra, GpgEX — удобный плагин для проводника Windows, который добавляет в контекстное меню пункты «Зашифровать», «Подписать», «Расшифровать», «Проверить контрольные суммы» и некоторые другие, GPA — еще один более простой на вид и менее функциональный менеджер ключей, GpgOL — плагин для почтового клиента Outlook).
Первый шаг в использовании GPG — создание своей пары ключей. Публичный ключ предоставляется всем желающим, а секретный хранится в надежном месте и служит для подписания информации от лица его владельца и расшифровки адресованной ему информации.
Создание пары ключей
На выбор предлагаются типы ключей X.509 (практически применяется в корпоративной среде) и OpenPGP. Выбираем OpenPGP. Вводим контактые данные, которые будут отображаться у всех владельцев нашего открытого ключа. Вместо настоящего имени можно указать никнейм. В дальнейшем некоторую информацию ключа будет возможно изменить.
По умолчанию используется шифрование RSA с длиной ключа в 2048 бит (2048 нулей и единиц машинного кода). С учетом развития квантовых технологий, данное шифрование всё менее и менее кажется надежным. В настоящее время себя хорошо зарекомендовало использование криптографии на эллиптических кривых. Подобные алгоритмы имеют невероятную криптостойкость и хорошую производительность, благодаря небольшой длине ключа.
Чтобы создать пару ключей на эллиптических кривых, переходим в дополнительные параметры. Пункт ECDSA/EdDSA — то, что нам надо. Дополнительный чекбокс (галочка) «+ECDH» даст ключу возможность шифровать, без нее сертификат можно будет использовать только для подписи и идентификации, так как ECDSA/EdDSA — алгоритмы подписи, а не шифрования. В выпадающих списках предлагается выбрать один из алгоритмов: ed25519, brainpool и NIST.
- ed25519 (Curve25519) — эталонная и непатентованной реализация криптографии на эллиптической кривой, имеет 128-битную длину. Является ключом EdDSA — самым актуальным алгоритмом цифровой подписи (считается, что без закладок от силовых структур каких-либо стран).
- brainpool — алгоритм, разработанный немецким сообществом криптографоф, в число которых входят университеты, государственные ведомства и коммерческие организации, например, компания Bosch. Поддерживает длины в 256, 384 и 512 бит. При подписи использует несколько устаревший алгоритм ECDSA.
- NIST — американский алгоритм, разработанный Национальным Институтом Стандартов и Технологий. Рекомендован для использования государственными органами США. Поддерживает длины в 256, 384 и 521 бит. По оценке некоторых специалистов, NIST лучше brainpool по производительности. При подписи использует несколько устаревший алгоритм ECDSA.
Для примера в обоих случаях используется алгоритм brainpool с максимальной длиной ключа. По умолчанию ключ создается со сроком годности в два года. Этот параметр можно изменить, либо вовсе отключить, тогда ключ будет бессрочным.
На следующем шаге задается пароль, который является последним рубежом защиты секретного ключа. Не следует передавать кому-то секретный ключ, но если так все-таки вышло, будет лучше, когда вы задали очень надежный пароль. Рекомендуется использовать специальные знаки (символы пунктуации и прочее) для надежной защиты от брутфорса. Лучшим вариантом будет длинный пароль, полученный из генератора случайных символов, однако не забывайте про золотую середину между использованием и безопасностью. Например, вводить на телефоне очень длинный и сложный пароль с символами из расширенной таблицы ASCII, не имея возможности его скопировать из менеджера паролей, будет весьма проблематично.
Итак, пара ключей создана! Обратите внимание на отпечаток, это уникальный идентификатор вашего ключа. Даже если кто-то захочет представиться вами, создав ключ с такими же именем и электронной почтой, его отпечаток будет отличаться. Именно поэтому важно сверять отпечатки получаемых ключей.
Клеопатра предлагает сделать резервную копию ключей, что по факту является экспортом закрытого ключа. Эту операцию в дальнейшем можно произвести в любой момент.
Открыв экспортированный ключ в текстовом редакторе, мы увидим специфичный фрагмент текста, начинающийся словами «BEGIN PGP PRIVATE KEY BLOCK». Будьте внимательны, не отправьте его кому-то по ошибке! Открытые ключи, предназначенные для передачи вторым лицам, начинаются со слов «BEGIN PGP PUBLIC KEY BLOCK».
Большое преимущество GPG перед другими средствами идентификации заключается в легкой переносимости ключа. Например, его можно распечатать на бумаге или выучить наизусть. Хранить можно только приватный ключ, так как при необходимости кому-то передать публичный, мы всегда можем экспортировать его из секретного (выводится математическим путём).
Экспорт и импорт
Для операций с ключом, щелкните по нему правой кнопкой мыши.
Для импорта ключей (нашего уже существующего на новом устройстве или полученного публичного), воспользуемся кнопкой «Импорт». Также можно использовать двойной клик по файлу ключа, это автоматически откроет Клеопатру и импортирует выбранный ключ. GPG-файлы встречаются с расширениями *.asc, *.pgp и *.gpg. Это не имеет большого значения, так как расширение нужно больше для удобства пользователя и лишь немного — приложений. Файл будет корректно прочитан и в случае, когда специальное расширение изменено или удалено.
Очень часто ключи распространяются в виде текстового блока. В таком случае, скопировав ключ, можно импортировать его через меню операций с буфером обмена.
Программа попросит удостовериться в подлинности ключа. В настоящее время самым простым и эффективным способом является сравнение отпечатка, поэтому его публикуют вместе с ключом. Если отпечаток совпадает с заявленным, заверяем сертификат.
Теперь мы можем проверять подпись владельца нового ключа и шифровать для него информацию.
Шифрование и подпись
Чтобы зашифровать и подписать файл, воспользуемся соответствующим пунктом меню на верхней панели.
После выбора файла, предлагается выбрать нужные операции. Подпись позволяет получателю убедиться в авторстве файла. Эта функция очень полезна: расшифровав архив, мы точно знаем, что архив был зашифрован владельцем обозначенного ключа, а не кем-то другим, кто просто располагает нашим публичным ключом. Использовать подпись — полезная привычка в большинстве случаев.
Распространненым способом безопасного хранения данных на облачном хранилище является GPG-шифрование файлов «для себя». В таком случае расшифровать информацию можно будет только нашим ключом.
Также возможна подпись без шифрования. Чаще всего применимо к текстовой информации. Механизм подписания строится на хеш-сумме: позволяет сравнить актуальное состояние информации с тем, какой она была, когда ее подписывал отправитель. Для примера откроем «блокнот».
Назначив отсутствие шифрования для кого-либо, оставляем только подпись и нажимаем кнопку «Подписать».
После ввода пароля от ключа, видим, что к фразе «Отличная работа» добавился дополнительный текстовый блок с хеш-суммой SHA512.
Если сейчас проверить подпись, она будет верна, но если изменить хотя бы один символ или добавить пробел, проверка выявит недействительную для данного текста подпись. Это связано с тем, что хеш-сумма данного массива информации абсолютна отлична от той, когда вместо буквы «Я» стояла «я».
В случае подписи файла без шифрования, в директории файла создается сигнатура с расширением *.sig, которую следует передавать вместе с исходным файлом. Если в файле изменится хотя бы один бит, проверка подписи выдаст ошибку.
Постскриптум
Все локальные ключи централизованно хранятся на устройстве в специальной папке. Все программы, взаимодействующие с GPG, будут их видеть. Для общения по протоколу XMPP (Jabber), защищенного GPG-шифрованием, можно использовать Gajim, который также является кроссплатформенным. Для ведения защищенной почтовой переписки удобно использовать этичный клиент Thunderbird, в который необходимо будет импортировать секретный ключ, так как он имеет свое изолированное хранилище ключей. Об использовании Thunderbird написано тут.
В статье опущено много технических нюансов, так как она рассчитана на широкий круг пользователей, которые в том числе имеют низкий уровень познаний в криптографии и ищут стартовую позицию для знакомства с действительно надеждным сквозным шифрованием.
- Информационная безопасность
- Криптография
- Open source
Работаем с цифровыми подписями GPG
Существует огромное количество статей и даже книг по работе с GnuPG, однако одну из самых полезных важных функций — работу с цифровыми подписями — в них обычно опускают. Устраним этот недостаток.
Введение
В данном HOWTO мы подробно рассмотрим как работать с GnuPG второй версии из терминала, а также графический интерфейс на примере утилиты Kleopatra, входящей в состав графической среды KDE, а также набор GnuPG for Windows.
Создание новой ключевой пары
Начнём мы конечно же с создания ключевой пары: связки из открытого и закрытого ключа, которые будут использоваться нами для для подписи и их проверки. Открытую часть вы должны распространять любыми возможными способами, а закрытую хранить в надёжном месте.
Консоль
gpg2 --gen-key
Утилита gpg2 потребует указать полное имя, адрес электронной почты и затем пароль для защиты секретного ключа. Все остальные параметры будут заданы по умолчанию, включая его длину (по умолчанию 2048 бит).
gpg2 --full-generate-key
В данном режиме уже можно настроить любые параметры: тип ключа (рекомендуется RSA/RSA), его длину (рекомендуется увеличить до 4096 бит), срок действия (по окончании срока действия ключ станет непригодным для шифрования и создания новых подписей, но может использоваться для расшифровки и проверки уже существующих цифровых подписей), полное имя, адрес электронной почты, описание и пароль.
Настоятельно рекомендуется указать как можно более сложный пароль для шифрования закрытой части ключевой пары, дабы в случае попадания в руки злоумышленников, им было сложнее ею воспользоваться.
Также рекомендуется во время создания ключевой пары ответить утвердительно на вопрос о желании создать сертификат отзыва ключа на случай его компрометации, распечатать его и сохранить в надёжном месте, например в сейфе. Если это не было сделано сразу, то его можно будет сгенерировать позднее.
GUI
Сначала запустим данную утилиту штатным для используемой операционной системы способом и увидим её главное окно, где отображаются все созданные или импортированные ключи. Полужирным шрифтом обозначаются те, для которых у нас есть закрытая часть, т.е. наши ключи.
Для того, чтобы создать новую ключевую пару, в меню Файл (File) выберем пункт Новая ключевая пара (New key pair), а затем Создать личную пару ключей OpenPGP (Create new OpenPGP key pair).
Далее в появившейся форме мастера создания ключей укажем наше имя и адрес электронной почты.
Нажатие кнопки Дополнительные параметры позволит задать различные необязательные настройки создания ключевой пары: тип, длину ключа, а также срок действия.
После указания всех необходимых данных и, опционально, параметров, жмём кнопку Далее (Next). Мастер ещё раз предложит убедиться, что всё указано верно и затем нажать кнопку Создать (Create).
Через несколько секунд начнётся процесс сбора энтропии для создания секретного ключа и будет предложено ввести пароль для его защиты, а по окончании будет доложено о результате, а также выведен на экран отпечаток созданной пары. Нажмём Завершить (Finish) для выхода.
Экспорт открытого ключа
Для того, чтобы нам могли шифровать файлы/сообщения, а также проверять наши подписи, мы должны экспортировать свой открытый ключ в файл, либо на ключевой сервер.
Консоль
Экспорт открытого ключа в текстовый файл:
gpg2 --export --armor 0xD45AB90A > mykey.asc
Экспорт открытого ключа на сервер ключей:
gpg2 --keyserver pgp.mit.edu --send-keys 0xD45AB90A
Здесь 0xD45AB90A — отпечаток ключа нашей ключевой пары, открытый ключ которой мы экспортируем, а mykey.asc — имя файла, в который будет сохранён результат.
GUI
В главном окне Kleopatra выбираем нашу ключевую пару, нажимаем по ней правой кнопкой мыши и в контекстном меню выбираем пункт Экспортировать на сервер (Export on Server).
Если требуется экспортировать в файл, тогда в контекстном меню выбираем пункт Экспортировать (Export) и сохраняем файл.
Создание цифровой подписи файла
GnuPG позволяет использовать несколько типов подписей:
- встроенная в файл: содержимое файла изменяется так, чтобы в него была добавлена ЭЦП. Чаще всего применяется при отправке подписанных сообщений по электронной почте;
- отсоединённая в текстовом формате: создаётся файл с расширением *.asc вида mydocument.pdf.asc (где mydocument.pdf — имя оригинального файла);
- отсоединённая в двоичном формате: создаётся файл с расширением *.sig вида mydocument.pdf.sig в бинарном формате.
Для создания ЭЦП файла используется закрытый ключ из нашей ключевой пары, а для проверки — открытый.
Консоль
Создадим отсоединённую подпись в текстовом формате:
gpg2 --sign --detach-sign --default-key 0xD45AB90A --armor mydocument.pdf
Здесь 0xD45AB90A — отпечаток ключа нашей ключевой пары, а mydocument.pdf — имя файла, который мы будем подписывать ЭЦП.
Создадим отсоединённую подпись в двоичном формате:
gpg2 --sign --detach-sign --default-key 0xD45AB90A mydocument.pdf
Все параметры идентичны, но на выходе будет получен файл mydocument.pdf.sig.
Создадим встроенную в файл подпись в текстовом формате:
gpg2 --sign --default-key 0xD45AB90A --armor mydocument.pdf
Создадим встроенную в файл подпись в двоичном формате:
gpg2 --sign --default-key 0xD45AB90A mydocument.pdf
Внимание! При создании встроенных подписей содержимое файла-источника целиком включается внутрь, поэтому использовать данный формат не желательно из-за дублирования и значительного размера. Далее в статье мы будем рассматривать только отсоединённую ЭЦП, т.к. это самый популярный вариант подписи.
GUI
В главном окне Kleopatra нажмём кнопку на панели инструментов Подписать/Зашифровать (Sign/Encrypt).
В открывшемся окне сначала найдём на диске файл, который следует подписать, выберем его и увидим новое окно с настройками шифрования и подписи.
Выберем свой, который будет использоваться для подписи и, т.к. мы не хотим шифровать его, уберём флажки из всех чекбоксов блока Зашифровать (Encrypt).
Т.к. нам необходимо создать отсоединённую подпись, обязательно установим флажок в чекбокс Зашифровать / Подписать каждый файл отдельно (Encrypt / Sign each file separately).
После нажатия кнопки Подписать (Sign) будет предложено ввести пароль, указанный при создании ключевой пары.
Если пароль был введён верно, то процесс завершится успешно и будет создана действительная цифровая подпись. Нажмём Завершить (Finish) для выхода.
Импорт открытого ключа
Для проверки чужой цифровой подписи GnuPG, у нас должны быть:
- открытый ключ человека, который её создал;
- оригинальный файл и файл отсоединённой цифровой подписи.
Сначала мы должны импортировать ключ респондента, подписавшего файл (если это не было сделано ранее). Это можно сделать любым способом:
- текстовый файл;
- серверы-хранилища ключей;
- буфер обмена (для GUI утилит).
Консоль
Импортируем открытый ключ с ключевого сервера (наиболее популярный вариант):
gpg2 --keyserver pgp.mit.edu --recv-keys 0xD45AB90A
Здесь 0xD45AB90A — отпечаток открытого ключа, который мы импортируем.
Импортируем открытый ключ из файла:
gpg2 --import mykey.asc
Здесь mykey.asc — имя файла с открытым ключом.
Теперь мы должны установить доверие импортированному ключу, т.к. в противном случае не сможем проверить подпись. Войдём в интерактивный режим:
gpg2 --edit-key 0xD45AB90A
Установим доверие ключу:
trust
Проверим отпечаток респондента (например посредством телефонного звонка или любым другим способом), затем выберем пункт Я полностью доверяю (I trust fully). Выходим из интерактивного режима:
quit
Также мы можем подписать чужой ключ своей подписью после его проверки. Это можно сделать так:
gpg2 --sign-key 0xD45AB90A
Созданную подпись рекомендуется отправить назад на ключевой сервер:
gpg2 --keyserver pgp.mit.edu --send-keys 0xD45AB90A
Здесь 0xD45AB90A — отпечаток открытого ключа респондента.
GUI
Для того, чтобы импортировать открытый ключ с сервера в Kleopatra, мы должны знать либо его отпечаток, либо адрес электронной почты, который был указан при его создании. Введём запрос в поле Искать (Search) и нажмём Поиск (Search). Как только будет найден необходимый, выберем его и нажмём Импорт (Import).
Если требуется загрузить открытый ключ из текстового файла достаточно просто нажать в главном окне Kleopatra кнопку Импорт (Import) и указать данный файл.
Проверим отпечаток импортированного ключа и, если всё верно, установим ему уровень доверия посредством выбора ключа в главном окне и пункта Изменить уровень доверия (Change Certification Trust) в контекстном меню.
Если необходимо, подпишем его (пункт Подписать (Certify)) контекстного меню). Проверим отпечаток ключа (контрольную сумму) и нажмём Далее (Next).
Поставим точку в пункт Сертифицировать для всех (Certify for all) и Отправить заверенный сертификат на сервер (Export signed certificate to server), затем нажмём кнопку Удостоверить (Certify).
Проверка цифровой подписи
Внимание! Файл отсоединённой ЭЦП должен лежать в том же каталоге, что и оригинальный файл, иначе выполнить проверку его подлинности будет невозможно.
Консоль
Проверка отсоединённой подписи файла:
gpg2 --verify mydocument.pdf.sig
GUI
В главном окне Kleopatra, на панели инструментов, выберем пункт Расшифровать и проверить (Decrypt and verify), затем найдём на диске файл отсоединённой подписи и откроем его.
Через несколько секунд программа произведёт проверку ЭЦП и выведет результат.
Литература
При написании статьи использовалась литература из следующих источников:
- документация GnuPG;
- документация Kleopatra;
- криптосистема с открытым ключом;
- сеть доверия GPG.
Как зашифровать почту и сделать электронную подпись
В прошлой статье мы рассмотрели, как в принципе устроена криптография и как она работает. Теперь научимся использовать эти знания. В этом нам поможет стандарт реализации сертификатов шифрования OpenPGP. Создаём свой сертификат
Для начала установим программу gpg4win. После этого появляется менеджер ключей Kleopatra:
При помощи этой утилиты мы будем выписывать сертификаты. Её преимущество в том, что сертификат затем можно будет загрузить на сервер ключей, а при переустановке программы на другой компьютер просто импортировать необходимые ключи с сервера.
Создаём сертификат. В меню «Файл» выбираем пункт «Создать новую пару ключей»:
Выбираем тип сертификата — OpenPGP:
Затем нужно задать имя и адрес электронной почты. В дополнительных параметрах можно выбрать криптографические алгоритмы:
Обязательно обратите внимание, какие параметры будут у полученной ключевой пары:
При создании ключей необходимо будет задать пароль для защиты информации:
Когда создадутся ключи, лучше на всякий случай сделать их резервную копию и хранить её у себя:
Ещё советую создать сертификат отзыва. С его помощью в дальнейшем можно будет сделать ваш сертификат недействительным, если понадобится.
В принципе, на этом этапе уже можно работать. Но для начала неплохо бы опубликовать сертификат на сервере ключей, чтобы иметь к нему доступ из любого места. Сделать это можно, выбрав из списка нужный сертификат и соответствующий пункт в меню «Файл»:
После этого сертификат экспортируется на сервер ключей, который указан в настройках Kleopatra (по умолчанию это http://keys.gnupg.net).
Теперь мы можем зашифровать или расшифровать файл, подписать его и проверить подпись.
Шифруем файл при помощи OpenPGP
Выбираем сертификат, жмём кнопку «Подписать / зашифровать». В открывшемся окне указываем файл для шифрования.
Теперь надо выбрать, для кого мы шифруем файлы.
Потом вводим пароль для сертификата — и всё, файл зашифрован. Можно открыть его в текстовом редакторе и посмотреть:
Расшифровываем файл
В Windows для расшифровки достаточно двойного клика по созданному зашифрованному файлу. Если в системе установлена Kleopatra, то ассоциация файлов настраивается автоматически и программа сама запускается.
Чтобы собеседники могли отправлять нам зашифрованные сообщения и проверять подпись отправленных нами файлов, нужно экспортировать наш открытый ключ (сертификат) в файл. Для этого есть кнопка «Экспорт. ».
Теперь этот файл можно передать на другое устройство. А собеседник сможет установить такой сертификат в свой менеджер ключей (например, Kleopatra) — и отправлять нам зашифрованные нашим открытым ключом сообщения. Этим же открытым ключом проверяется целостность ЭЦП у файлов, которые мы ему отправим.
Соответственно, если мы хотим зашифровать почту для собеседника, нам нужен его открытый ключ шифрования. Он может прислать его письмом или опубликовать на сервере ключей, чтобы мы этот ключ загрузили.
Интеграция с электронной почтой
В популярном почтовом клиенте Mozilla Thunderbird есть интересный плагин для работы с сертификатами ЭЦП и шифрования сообщений — Enigmail. Он позволяет и шифровать почту, и подписывать её с помощью ЭЦП. Для работы плагина в системе должен быть установлен компонент PGP. Во многих Debian-подобных ОС Linux он присутствует в репозиториях пакетов.
Установите в систему PGP и настройте сертификаты шифрования, как обговорили выше. И можно перейти к настройке почтового клиента.
Чтобы установить Enigmail в Thunderbird, выберите меню «Инструменты» — «Дополнения». Далее найдите Enigmail и выполните инструкции:
Теперь мы можем создать новое письмо — при этом в меню появится пункт Enigmail. Настройки программы разнообразны и находятся в меню Enigmail — Preferences:
В настройках вы можете проверить, есть ли в системе GnuPG (ссылка выше). Это критически важно.
Можно настроить систему так, чтобы она автоматически прикрепляла открытый ключ при отправке сообщения (если оно зашифровано или подписано). Далее возможны два сценария.
Сценарий 1: если вы ранее создали ключи и экспортировали их на сервер. В этом случае в Enigmail их можно получить с сервера. Добавляем в Thunderbird учётную запись почты, для которой были сформированы ключи. При создании письма у вас появится меню Enigmail, в котором можно будет импортировать ключи в систему:
Если щёлкнуть правой кнопкой мыши по полю с именем ключа, то попадём в контекстное меню с основными операциями, которые можно выполнить с сертификатами:
Теперь составляем письмо и выбираем в меню Enigmail пункты Sign Message и Attach my public key.
Возможно, придётся указать, как подписать письмо. Выбирайте строчку с PGP.
Адресат теперь получит подписанное письмо и сможет импортировать себе ключ отправителя.
Как только он сделает это, сможет проверить подлинность подписи.
Сценарий 2: если ключи не были созданы. В этом случае их можно будет сгенерировать прямо в Enigmail. Это делается с помощью мастера настройки согласно руководству или вручную.
Для тестирования мы будем использовать тестовый почтовый сервер на виртуальной машине с условным доменом (неважно каким). Создадим ключи для учётной записи pc1@”имя домена” и отправим его по адресу pc2@”имя домена”.
Сначала создаём новое сообщение. Далее переходим в меню Enigmail и выбираем раздел Key Management:
Теперь в открывшемся окне выбираем Generate — New Key Pair:
В следующем окне надо задать параметры ключей. Особенно важен их срок жизни — стоит реально оценить, насколько необходимо делать его долгим:
По завершении процесса система посоветует сгенерировать сертификат отзыва. Напомню: он пригодится, чтобы пометить сертификат как недействительный:
Система спросит пароль от сертификатов:
Теперь письмо можно подписать (и / или зашифровать) и отправить получателю. Для этого на панели появятся две кнопки. Помните, что сообщение подписывается закрытым ключом отправителя, а подпись проверяется по его открытому ключу (который можно послать вместе с письмом):
Получатель может импортировать себе открытый ключ отправителя. После этого письмо можно будет проверить:
Если надо зашифровать сообщение, потребуется открытый ключ получателя. Он сможет переслать его нам вместе с подписанным письмом.
Теперь встанем на место пользователя — сгенерируем открытый ключ для пользователя pc2 (аналогично pc1):
После генерации ключа можно создать новое сообщение и прикрепить ключ для pc2. На стороне получателя (теперь это pc1) добавим ключ в список доверенных. После этого можно будет проверить подпись:
Если потребуется зашифровать сообщение от pc1 к pc2, то потребуется открытый ключ получателя — ключ pc2. А если ещё и подписать — то и открытый ключ отправителя (pc1):
Если оба нужных ключа у отправителя есть, то они прикрепляются к письму автоматически. Причём можно ещё и заменить строку с темой письма на невнятный текст. Вот так будет выглядеть для получателя зашифрованное (но не расшифрованное) и подписанное письмо:
Вводим пароль и видим открытый текст:
Письмо было подписано, подпись проверена и расшифрована.
Итоги и рекомендации
Мы научились защищать свою почту с помощью шифрования. Электронная подпись генерируется закрытым ключом отправителя, а проверяется по открытому ключу отправителя. Шифрование осуществляется открытым ключом получателя, а дешифрование — закрытым ключом получателя.
Несколько советов:
- Всегда создавайте сертификаты отзыва — так вы сможете легко сделать недействительными свои сертификаты, если потребуется.
- Используйте серверы хранения ключей (если вас не мучает паранойя, что они могут быть известны третьим лицам).
- Не разбрасывайтесь ключами — не нужно их рассылать кому попало 🙂
- Пользуйтесь менеджером ключей — так вы сможете эффективнее ими управлять.
Источники:
- OpenSSL Command-Line HOWTO
- Криптоалгоритмы. Классификация с точки зрения количества ключей
- How do I do public-key encryption with openssl?
- Шпоры по сертификатам X.509
Напоминаю ссылку на первую часть статьи, где мы рассмотрели теоретическую часть и базовую работу с шифрованием.
Защита электронной почты — это лишь малая часть одного из курсов факультета информационной безопасности GeekUniversity. Присоединяйтесь, и вы научитесь защищать компьютерные сети, веб-приложения и всю IT-инфраструктуру в целом.
Шифрование с помощью GnuPG для пользователей
Я думаю, все вы знаете, что такое криптография и для чего она нужна. Обычно, когда начинают писать про криптографию, уходят в теоретические дебри математики, после чего остается вопрос «А что теперь с этим делать?» На самом деле сейчас существует достаточно большое количество программ, которые позволяют легко зашифровать вашу переписку или файлы, не сильно вдаваясь в подробности того, как это все работает.
Этот пост как раз и посвящен тому, как обычный пользователь может использовать шифрование на основе стандарта OpenPGP с использованием программ с открытым исходным кодом.
Термины и немного теории
Чтобы в дальнейшем было понятно, что мы делаем, давайте разберемся в терминах, которые будем использовать, что такое PGP, OpenPGP, GnuPG, какие программы мы будем использовать, и что они делают. На самом деле про каждый термин можно рассказывать долго, я опишу это в сжатом виде, достаточном для использования программ.
В дальнейшем мы будем обозначать участников передачи сообщений так, как это предложил Рон Ривест (один из авторов алгоритма RSA) в 1978 году. Для наглядности, чтобы не писать, что некто A должен передать сообщение некоему B, он дал этим A и B имена соответственно Alice и Bob. В русскоязычных статьях Alice обычно называют Алисой (правильно, конечно, было бы ее называть Элис, но Алиса тоже начинается на букву А), а Bob остается Бобом. Как правило, Алиса передает сообщение Бобу, а Боб его расшифровывает. В принципе, есть совсем русифицированные криптографические имена, когда Антон передает сообщение Борису, но в этом посте пусть фигурируют Алиса и Боб. Кроме них есть еще несколько героев, например, зловредная Ева (Eve), имя которой получилось от слова eavesdropper — подслушивающий. Как вы понимаете, Ева пытается прочитать сообщение, которое Алиса посылает Бобу. В русскоязычной версии Ева стала Зиновием (от слова Злоумышленник). Есть еще множество подобных персонажей, каждому из которых отведена своя роль, но мы здесь ограничимся Алисой, Бобом и Евой, которая у нас будет фигурировать незримо.
В данном посте упор будет сделан на шифрование с открытым ключом, которое также называется асимметричным шифрованием. Попытаюсь на пальцах объяснить, в чем его суть. Многие века, вплоть до 70-ых годов прошлого века, для шифрования и расшифровки использовался единый ключ (это может быть ключевая фраза, комбинация деталей шифровальной машины и т.п.), который должен был быть известен, и тому, кто шифрует сообщение, и тому, кто его должен прочитать. Это так называемое симметричное шифрование. Основная проблема в нем — обмен ключами. Как Алисе и Бобу договориться о том, какой будет ключ? Самый надежный вариант — встретиться и выбрать этот ключ. Но это не удобно во времена интернета, когда Алиса и Боб могут находиться в разных концах мира. Просто переслать ключ они друг другу не могут, потому что их переписку может читать Ева.
Решение было найдено в 70-ых годах прошлого века, не буду вдаваться в подробности, о которых много уже понаписано (например, это очень популярно рассказывается в Книге шифров). Если в двух словах, то современные алгоритмы шифрования стали использовать другую технику, когда для шифрования и расшифровки используются разные ключи. И Алиса, и Боб имеют два ключа. Первый ключ открытый, который они могут спокойно рассылать по почте и оставлять его везде в интернете, и не беспокоитсья о том, что Ева этот ключ узнает. Другой ключ закрытый, его нужно держать в секрете и беречь от Евы. Итак, Алиса знает открытый ключ Боба. Именно с помощью этого ключа Алиса и шифрует сообщение. Вся хитрость несимметричного алгоритма заключается в том, что зашифровав сообщение с помощью открытого ключа Боба, Алиса сама уже не сможет расшифровать это сообщение, его сможет прочитать только Боб с помощью своего закрытого ключа, который он хранит в секрете. Строго говоря, если Боб не собирается слать сообщения Алисе, то ему открытый ключ Алисы и не нужен. Это и есть несимметричный алгоритм.
PGP. Сокращение от слов (Pretty Good Privacy, достаточно хорошая секретность). Именно так называлась программа, которая была написана Филиппом Циммерманном в 1991 году. Она была предназначена для удобного шифрования данных. У этой программы довольно сложная судьба, за нее Циммермана пытались судить в США, программу перекупали друг у друга разные фирмы, в данный момент PGP принадлежит фирме Symantec, и PGP является коммерческой программой.
Изначально PGP умел только шифровать симметричным алгоритмом, но теперь PGP — это не только шифрование с открытым ключом, шифрование в ней — это заключительный этап обработки данных. До этого данные могут быть сжаты, зашифрованы алгоритмом с симметричным ключом, и затем уже происходит шифрование с открытым ключом. Причем, на каждом этапе могут использоваться различные алгоритмы. Более того, тот алгоритм, который будет использоваться в дальнейшем, может использовать для шифрования несколько открытых ключей таким образом, что зашифрованное сообщение смогут прочитать несколько человек (как вариант, Алиса может зашифровать сообщение используя открытый ключ Боба и свой открытый ключ, тогда она сама тоже сможет расшифровать посылаемое сообщение). Другой интересной особенностью является то, что сгенерированные ключи могут иметь срок годности, после которого они считаются недействительными.
Итак, PGP — это коммерческая программа, но пока этой программой владел Циммерман и фирма PGP, Inc. (затем PGP, Inc. поглотит фирма McAfee, которая тогда называлась Network Associates, Inc), они предложили стандарт OpenPGP (RFC 4880 и предыдущая его версия RFC 2440), который описывает то, как работает PGP для того, чтобы сторонние программисты могли бы создавать свой софт, совместимый с PGP.
Кроссплатформенная реализация с открытым кодом стандарта OpenPGP называется GnuPG. Самое интересное, что изначально GnuPG начал писать немецкий программист Вернер Кох, а потом немецкое министерство экономики и технологий профинансировало портирование GnuPG под Windows (gpg4win).
GnuPG может использовать меньшее количество алгоритмов по сравнению с PGP, так как в GnuPG реализованы только те алгоритмы, на которые нет каких-либо патентных ограничений, хотя некоторые запатентованные алгоритмы можно подключать как дополнительные модули.
Практика
Итак, с терминами мы разобрались. Давайте теперь посмотрим, что должны делать Алиса и Боб, чтобы безопасно посылать друг другу сообщения, не опасаясь любопытной Евы.
Как я уже писал, мы (от лица Алисы и Боба) будем использовать свободную реализацию стандарта OpenPGP — GnuPG. Для демонстрации Алиса будет использовать реализацию GnuPG под Windows (для повторения примеров качайте полную версию), а Боб — под Линукс. Так как GnuPG — это набор консольных утилит, то для простого пользователя проще воспользоваться какой-нибудь графической оболочкой над ней, в данном посте это будет кроссплатформенная программа Kleopatra, которая входит в том числе и в Windows-версию GnuPG.
GnuPG под Windows ставится очень просто, запускаем инсталлятор, а дальше Next->Next->Next… Под Линукс программа ставится еще проще, например, под Ubuntu просто выполняем команду:
а дальше все необходимое само скачается и установится.
На некоторых шагах поведение Kleopatra под Windows и Линукс может отличаться, но не значительно.
Генерация ключей
Первое, что нужно сделать Алисе и Бобу — это сгенерировать себе по паре ключей (открытый + закрытый). Вообще-то в дальнейших примерах сообщения будет слать только Алиса, поэтому пару ключей нужно создавать только Бобу, но так как у нас Алиса работает под Windows, то я покажу процесс генерации ключей на ее примере, чтобы это было ближе к большинству читателей.
Алиса запускает Kleopatra и видит главное окно программы:
В большой таблице, которая на этом скриншоте пустая, отображаются известные программе ключи (свои и чужие открытые)
Ключи в программе называются сертификатами. Чтобы создать новую пару ключей она выбирает пункт меню File -> New Sertificate…, появится окно, показанное на следующем скриншоте:
Нас в данный момент будет интересовать работа по стандарту OpenPGP, поэтому нужно нажать верхнюю кнопку и перейти в окно, где надо заполнить информацию о владельце ключа:
В принципе, можно нажимать кнопку Next, но любопытные могут заглянуть в настройки сертификата:
Настройки по умолчанию сейчас нас устроят. Ключ будет создаваться для алгоритма RSA с разрядностью 2048 бит, на данный момент это считается устойчивый ко взлому ключ. Этот ключ можно будет использовать для шифрования (Encryption) и для электронной подписи (Signing). Срок годности ключа ограничивать не будем, а если надо, чтобы сертификат «протух» после определенной даты, то надо установить галку Valid until и установить до какой даты ключ будет действовать.
Электронная подпись выходит за рамки этого поста, но пару слов все-таки о ней скажу. По сути это шифрование наоборот. Представьте, что открытый и закрытый ключ поменяли местами. Алиса шифрует текст с помощью своего закрытого ключа и оставляет это сообщение где-то в интернете вместе с открытым ключом, с помощью которого любой может расшифровать ее сообщение. Таким образом получается, что если расшифровать сообщение Алисы удалось, значит оно было подписано ее закрытым ключом, следовательно это сообщение оставила именно Алиса, а не кто-то другой. Правда, здесь возникает проблема подтверждения публичного ключа, что это именно ключ Алисы. Для этого служат различные сервисы сертификации, с помощью которых можно проверить, кому принадлежит тот или иной ключ, который у них зарегистрирован.
Вернемся в Kleopatra. Настройки оставляем без изменений и переходим к следующему окну, где можно окончательно убедиться в верности введенных данных:
После этого будет предложено ввести пароль для шифрования закрытого ключа, чтобы он не хранился в явном виде.
Придумываем надежный пароль, затем его подтверждаем. Все, ключ создан.
Здесь можно сохранить резервную копию ключей в файл. При этом будет создан бинарный файл с расширением pgp, например, alice.pgp.
На следующем скриншоте показано окно Kleopatra, где появился ключ Алисы (Alice):
Будем считать, что то же самое проделал и Боб:
Для генерации ключа Боба, к его имени пришлось добавить несколько символов подчеркивания, потому что программа не хотела создавать ключ для имени длиной три символа.
Обмен ключами
Алиса и Боб имеют по паре ключей. Теперь им надо обменяться открытыми ключами, но как их достать из программы? На самом деле очень просто. Выбираем нужный сертификат из списка и выбираем пункт меню File -> Export Sertificates. Программа предложит сохранить файл с расширением asc. Сохраняем его. Это текстовый файл, который будет выглядеть примерно так:
——BEGIN PGP PUBLIC KEY BLOCK——
Version: GnuPG v2.0.17 (MingW32)mQENBE8CuKABCADXpNmSlhNvWqOwWouF1BS98SB5YeO16C2vVLoR1FokkDrG5j6U
hjGZ2V0ojPzKGugdvGz0LvU0zJpFfUk5t4zoVo4Hb3D6WAGR+vhrTRV7P/QJe396
G0JEW9RlLxfrilUdZ6sJ599+pocHPVUAKEPTIxDdU7ZRMPmszwluPWfXdgxfwxQ2
IOxIe2vdN2HAlOBG9Ce1HR6tf0amkgUlNzU+JdXSLIhKpy4zWLo2giyonw4TBuAP
/nVhXJbTXWOyZaQw+fbHlFy2LiPCRFqUaksNOqwMdXs+LjhYxhHOojSMuFw3U1xL
kp+mfB531CJFxZxFDKXz2EDN7lDB1HvdHQnfABEBAAG0GEFsaWNlIDxhbGljZUBn
b29nbGUuY29tPokBOAQTAQIAIgUCTwK4oAIbDwYLCQgHAwIGFQgCCQoLBBYCAwEC
HgECF4AACgkQSXOOeGHS44XplAgAngT686Et08ADejMua2AgdIoSznKEbBT1cD3t
Hagr7B+bJw6pl1aFwP+5hXivqIOrJv4ASUuJ+LfMxP9tR2aNNH5vrjqWTacQabQg
JAAC3L4PFyQDaYBbb98CWfqJMxPUAehIPdmmy5dfoNI3CHwuPM9GMiZlvbHdxI4n
OuvvG5/vzYLpDi5gjFdRQs6vg9iT1JoLHDXFKGCOxOTsUrhcZWXgo++T0j0PIemi
dE695QhV79vqxpSufKDtzSsoT7UfPTCtDmBmia1sSbcgS56XM1+Ijw90PyFJ0rG7
vmIAuQ5cHJ/p40APHOpR4STGl+NLymMnivzcutsYyhNaoboUtA==
=ctUV——END PGP PUBLIC KEY BLOCK——
Теперь Алиса должна переслать свой файл asc Бобу, а Боб, соответственно, свой файл Алисе. Или можно просто послать текст ключа, добавив его в текст электронной почты, при этом сохранив шапку ——BEGIN PGP PUBLIC KEY BLOCK—— и подвал ——END PGP PUBLIC KEY BLOCK——
Теперь Алиса должна добавить открытый ключ Боба в список сертификатов. Этот процесс тоже очень простой. В программе Kleopatra Алиса выбирает пункт меню File -> Import Sertificates… и выбирает файл asc, который ей послал Боб. После этого будет выведено сообщение о том, что ключ импортировался:
Теперь в списке сертификатов Алисы появился открытый ключ Боба:
Можно на него дважды щелкнуть и посмотреть информацию:
Если бы Боб послал Алисе свой ключ не в виде файла, а в виде текста, то Алиса должна была бы скопировать его в буфер обмена (вместе с шапкой и подвалом), а затем нажать правую кнопку мыши на значок Kleopatra в трее и выбрать пункт меню Clipboard -> Sertificate Import, ключ точно так же был бы импортирован.
Шифрование
А теперь самое интересное. Алиса хочет отправить Бобу зашифрованное сообщение. Для этого она должна проделать следующие операции. Есть два варианта отправить секретное сообщение: зашифровать файл или зашифровать содержимое буфера обмена. Начнем с шифрования файлов, это более безопасный способ.
Итак, Алиса создает файл с сообщением Бобу (например, from_alice.txt). Затем в Kleopatra выбирает пункт меню File -> Sign/Encrypt Files… и выбирает файл с сообщением, после чего откроется следующее окно:
Здесь можно выбрать, что нужно сделать с файлом: зашифровать (Encrypt, выбрано по умолчанию), подписать файл (Sign), или сделать и то, и другое (Sign and Encrypt). Если установить галку Text output (ASCII armor), то в результате шифрования будет создан не бинарный файл, а текстовый, содержимое из которого можно вставить, например, в текст письма. Если установить галку Remove unencrypted original file when done, то после шифрования исходный файл будет удален.
Только для шифрования нужно выбрать пункт Encrypt, а ставить галку Text output (ASCII armor) или нет — дело вкуса.
Затем нам нужно выбрать сертификаты тех, для кого предназначено сообщение. Как я уже говорил, в программе есть возможность шифровать таким образом, чтобы расшифровать сообщение могли несколько человек. Но в данном случае Алисе это не надо, она посылает сообщение только Бобу, поэтому только его сертификат и добавляет в нижний список.
Нажимаем кнопку Encrypt, после чего программа может сообщить о том, что Алиса собирается зашифровать сообщение таким образом, что сама она его расшифровать уже не сможет.
Будем считать, что Алиса у нас еще в здравой памяти и расшифровывать свое сообщение ей не понадобится, поэтому нажимаем Continue.
После этого происходит шифрование, о его успешности говорит следующее окно:
Теперь рядом с файлом from_alice.txt создан файл from_alice.txt.gpg, если до этого не была установлена галка Text output (ASCII armor), или файл from_alice.txt.asc, если эта галка установлена была.
Файл asc напоминает файл с открытым ключом:
——BEGIN PGP MESSAGE——
Version: GnuPG v2.0.17 (MingW32)hQEMA8eYR6ADoZQ1AQf+OOyS4w/ri3aEFF1RbK5ph8ho8ZbE8JGyUuXSPt+jR6Py
oJvxsaZSfYjKf1vCjNFyn+TmHO0GxsHdFnPNfcegDk6LD4dNQok/M1pqacku2Ijb
YZREYIO5Oa1whfATYE+Qs3Rx9fIsPrLn/1JhEv0IFAUJU+P2+YoKZFp3KzAk28lb
CzqqLhS3eSKp/pL06X4ZFcGsaivWn8DsQDcpFzBN8XCyYuHqKUh9GhmIIiBf0NcY
oNmlo7rNiHhPVUJLVONbx6YpZazQ/cR0nXn0IKGltYS3Y5BC6ugUaRSa70huGxVd
160BvAr3Qtdzx5z34Ec/clJ/IfwBWKEPifN0h8KledKCATpJnvifTtZTHM//dsKT
GG3zQLLK4HQJ/tBUiTeLYpcdrSqv6RfQCyaxTJMQUUgCZ7yZ6FqfZG0dLhbhICEY
sCdrmS2aIhY0YQn3fZnqmdM2N0F/O4VCqOvKrtz16RHjB2WxXSTtJlJwnOgI9tzD
tVTjDCuuK0inWMuyn+SSvurC3Q==
=XNqU——END PGP MESSAGE——
Это и есть зашифрованное сообщение Алисы. Теперь она может переслать файл from_alice.txt.gpg или from_alice.txt.asc Бобу, а может вставить полученное сообщение в текст письма.
Кроме того, в программе Kleopatra есть возможность шифровать содержимое буфера обмена, для этого Алиса где-нибудь набирает текст, копирует его в буфер обмена и нажимает правую кнопку мыши на иконке в трее. В выпадающем меню выбирает пункт Clipboard -> Encrypt. Откроется окно
Нажимает кнопку Add Recipient… (добавить получателя), идет на вкладку Other Sertificates и выбирает сертификат Боба.
Внизу появляется предупреждение, что так как Алиса не выбрала свой сертификат, то сама она уже не сможет расшифровать свое сообщение.
Но ей это и не надо, она нажимает кнопку Next, после этого происходит шифрование, а затем откроется следующее окно, которое сообщает о том, что шифрование успешно завершено.
В буфере обмена теперь будет содержаться зашифрованный текст, который можно отправить по почте
——BEGIN PGP MESSAGE——
Version: GnuPG v2.0.17 (MingW32)hQEMA8eYR6ADoZQ1AQf+IEMRfO49t6MvExiyeEtN8Gr7jhYCfzAItDvCbqQuanuy
6SoSq2FR4mSytuOKWLyXvRys+pNDpZONbXzbGVTtJbTQbj8wuBSAh4nSKFpyWeTy
4CHO5zkmztYJ10aH84njEDuXjqdlKChsaoJwQnK1yQtQ+8TMBjRHvfMvEwHTRglz
Lgesd5tvXK0hn2jpO1ujZeqOurh3RExkFw0Mb8D6ZaR3bmo5QtFLrYxdYEA+Itmd
SSKoQqmsIhY2vR8uSFk6Jeo7BpglT/g+82J95qTfdN8RyC/5yZa21AkGe46gw+Io
cDSIItsKgcVqhHlUCf2p17OWbjMDHOCAaaCJQcw7mdKAAXbJIt8dF2UzOsUOmUCT
FQ/kjovcTcG98fwzZqlVfewWYNOpFVE9RaOIhuL/Q4+BcF6xXEgIBj2RxxdMLMB0
O7Pjize5B+YaDeu69795xhzNLP2vnBLDyZcMT7jAzhhWlLWWTuaWZeYT+mnnMD/8
DN6gBhFyfweJxP/1x48jY6o=
=GR54——END PGP MESSAGE——
Несмотря на то, что шифрование буфера обмена кажется более удобным, это потенциальная дыра, потому что буфер обмена легко отслеживается с помощью троянов или даже с помощью Punto Switcher.
Расшифровка
Боб получил письмо от Алисы с шифровкой. Рассмотрим шаги, которые он должен сделать, чтобы ее расшифровать. Для расшифровки сообщений Бобу не нужен никакой ключ, кроме собственного закрытого ключа.
Если Алиса послала сообщение в виде прикрепленного файла gpg или asc, то Боб запускает Kleopatra, выбирает пункт меню File -> Decrypt/Verify Files… и выбирает полученный от Алисы файл. Если все происходит удачно, то появится сообщение об успешной расшифровке:
А рядом с файлом from_alice.txt.gpg или from_alice.txt.asc будет создан файл from_alice.txt, который содержит исходный текст, который написала Алиса.
Если же Алиса послала Бобу сообщение в виде текста письма, то Боб копирует его в буфер обмена, затем нажимает правую кнопку мыши на иконке Kleopatra в трее и в выпадающем меню выбирает Clipboard -> Decrypt/Verify. Если расшифровка проходит удачно, то после этого в буфере обмена будет храниться расшифрованное сообщение.
Таким образом можно обмениваться зашифрованными письмами и тешить себя надеждой, что ваши послания не будут никем прочитаны, кроме получателя. Разумеется, в реальности все сложнее, и 100%-ой гарантии того, что вас не читают никто не даст.
В этом посте был рассмотрен случай, когда шифрование файлов для передачи их по почте происходит вручную, ко многим почтовикам и программам мгновенного обмена сообщений существуют плагины, которые облегчают шифрование/расшифровку сообщений, делая это на лету, прозрачно для пользователя, но это отдельная тема, которой в будущем можно будет посвятить пост, если она (тема) кому-нибудь будет интересна.
PS. Вы можете подписаться на новости сайта через RSS, Группу Вконтакте или Канал в Telegram.