Как создавать, подписывать, экспортировать, импортировать и проверять подписи OpenPGP в OpenKeychain и GPG4win с видеоинструкцией

О чем эта статья?
Эта статья о том, как самостоятельно создать сертификат электронной цифровой подписи, подписать ею документ, отправить его партнерам, проверить электронную подпись и разместить свой публичный ключ в интернете для того, чтобы партнеры могли проверить вашу подпись и убедиться, что она принадлежит вам. Мы описали работу с цифровой подписью для Windows и Android.
На кого это все рассчитано?
Для того чтобы прочитать статью и применить написанное на практике, не нужно знать кодинг и разбираться в шифровании. Статья написана простым, понятным языком, так, что, прочтя ее, создавать электронную подпись и подписывать документы сможет любой человек, для которого не составляет проблемы пользоваться девайсами и тырнетом.
Кто я и зачем я все это пишу
Нужно сказать, что я не являюсь специалистом ни в программировании, ни в шифровании. Большую часть того, что я написала в этом мануале, я сама поняла только в процессе написания. Я даже не могу гарантировать, что мое понимание совершенно правильно. Однако никакой инструкции по основам шифрования и использования популярных программ для цифровой подписи для обычных пользователей я не нашла. И это моя первая цель: хорошо разобраться и написать внятный «How to use» для кофейников. А вторая цель, то, почему, собственно, я этим всем занялась — это приобретающие все большую актуальность вопросы цифровой безопасности. Я не специалист в программировании и шифровании, но я психолог. Специалист в сфере психического здоровья. А вопросы цифровой безопасности имеют непосредственную связь с психическим здоровьем отдельных людей и благополучием общества в целом. Поэтому знание основ цифровой безопасности в наше время просто необходимо. Поэтому мне представляется очень важным объяснить эти основы простыми словами обычным людям.
Общие сведения
Что такое OpenPGP
PGP (Pretty Good Privacy — довольно хорошая приватность) — это система шифрования и базирующееся на ней программное обеспечение.
OpenPGP (Открытый PGP) — это стандарт шифрования с открытым исходным кодом (то есть с таким кодом, который каждый желающий может в любой момент посмотреть, и который распространяется без лицензии), позволяющий выполнять операции шифрования и цифровой подписи для безопасной передачи данных через интернет.
Программное обеспечение GPG на основе стандарта OpenPGP
GPG (GNU Privacy Guard или GnuPG) — это свободно распространяемое программное обеспечение, на основе стандарта OpenPGP, предназначенное для защиты информации с помощью комбинации симметричного и асимметричного шифрования, в частности для создания электронных цифровых подписей.
Название GPG призвано подчеркнуть разницу с программным обеспечением PGP, распространяемым лицензионно. Подробнее о разнице PGP и GPG например здесь.
Программное обеспечение GPG представлено прежде всего на сайте https://www.gnupg.org, и прежде всего это само GnuPG — кроссплатформенная программа, которая используется без графического интерфейса (управление осуществляется из командной строки), а также множество фронтендов («фронтенд» - это графическая оболочка, визуальное оформление для работы с программой) для самых разных целей.
GPG4win — это программное обеспечение GPG для Windows, реализующее стандарт OpenPGP, предназначенное для работы с электронными цифровыми подписями. Оболочка для этого приложения называется Kleopatra. Официальный сайт: https://gpg4win.org
OpenKeychain — это программное обеспечение GPG, реализующее стандарт OpenPGP для Android. Официальный сайт: https://www.openkeychain.org
Алгоритмы шифрования RSA и ECC
RSA и ECC – это самые популярные сегодня алгоритмы асимметричного шифрования.
RSA – аббревиатура фамилий еврейских авторов Rivest, Shamir и Adleman. Первая система, ставшая пригодной и для шифрования, и для цифровой подписи. Опубликованная в 1977 году, она широко используется даже в 2027, и известна своей надежностью и лучшим обеспечением совместимости для различных программных продуктов.
ECC — Elliptic Curve Cryptography (эллиптических кривых криптография). Также вам могут встретиться аббревиатуры ECDH и ECDSA — это названия алгоритмов, основанных на ECC. Это очень популярная сегодня система, которая обеспечивает большую криптографическую стойкость и при этом имеет более короткую длину ключей, чем RSA. Используется повсеместно, например, в криптовалютах, также и в цифровых подписях.
Встроенная и отсоединенная подпись
Цифровая подпись может быть встроенная или отсоединенная. Главные отличия: встроенная подпись включает в себя подписываемый файл, а отсоединенная — нет. Файл с отсоединенной подписью можно легко посмотреть, а для доступа к файлу с встроенной подписью необходимы специальные программы.
Встроенная цифровая подпись — это, по сути, зашифрованный файл типа архива. Он содержит подпись, которая встроена в оболочку, и сам подписываемый файл. Поэтому подписываемый файл отдельно можно не отправлять. Исходный файл находится внутри подписи и становится доступен после расшифровки. Однако получить к нему доступ невозможно без шифровальных программ. Используется в тех случаях, когда сохранность оригинала важнее, чем легкий доступ к его содержимому.
Отсоединенная цифровая подпись — добавляет шифр к исходному (подписываемому) файлу и отдельный файл с шифром (подписью). Если исходный файл изменяется, то сличение шифров (расшифровка) обнаруживает эти изменения и сообщает об ошибке. Поэтому отсоединенная подпись должна обязательно поставляться и проверяться вместе с тем файлом, который был ею подписан. Используется, когда подписанный файл должен быть легко доступен для получателя без всяких программ.
Типы шифра в цифровой подписи
По типу шифра цифровая подпись может быть бинарная или текстовая. Это про то, как выглядит содержимое файла с шифром.
Бинарный шифр состоит из двоичного кода 0-1 и выглядит так:
01000010 01101001 01101110 01100001 01110010 01111001 00100000 01100011 01101111 01100100 01100101 00100000 01101001 01101110
Текстовый шифр — это UTF-8 (Юникод), который выглядит так: ÁÁL#¼¬Éר‹ç×## ×N&îÌKÜáè##ƒ/×™‘a#²³ŠaI!##B¬3%gµÂb'°}y.]Dô(#ܵo
¯«lgÌæ5#±/ŠW j’#÷Š @yxâ™ ßÕm¹#vB#kƒ@«0z/€Õ ÉØ'¡ªÊC›%øü4#ÔÎÃú
Если вам интересны подробности, посмотрите например это.
Форматы .sig, .asc, .pgp и .gpg
.sig — это формат для отсоединенных подписей. Обычно имеет бинарный вид. Файл подписи содержит только саму подпись и действителен только вместе с оригинальным файлом.
.asc – текстовый формат ASCII-armor. Может использоваться как для отсоединенной, так и для встроенной подписи. Легко передавать по электронной почте и другим текстовым каналам.
.pgp — исторически первый формат для подписи. Обычно имееет бинарный вид.
.gpg – отличается от .pgp в основном тем, что .pgp обычно связан с коммерческим PGP, а .gpg — с открытым OpenPGP. Оба могут содержать как бинарные, так и текстовые (ASCII-armor) данные. Обычно используются для встроенной подписи, но могут использоваться и для отсоединенной.
Цифровыми подписями, в строгом смысле слова, можно назвать только отсоединенные подписи форматов .sig и .asc. Файл же со встроенной подписью правильней называть «зашифрованный файл».
Как это работает. Подписание и шифрование
Современная электронная подпись, основанная на асимметричном шифровании, имеет два ключа, которые всегда генерируются парой. Один из них называется «секретный» или «приватный» (private key). Это личный ключ, который нужно хранить как смерть Кащея и никому не показывать, и тем более никому не отправлять и не загружать ни на каких сайтах, кроме ваших собственных. А второй называется «открытый» или «публичный» (public key). Он публикуется в открытом доступе или отправляется вашему партнеру в файле .asc или .txt. Неплохое объяснение асимметричного шифрования можно найти например в этой публикации, в разделе «Что такое электронная подпись». Поскольку наша статья для людей, далеких от IT, дальше мы введем условные термины, которые не используются больше нигде, кроме данной статьи, но которые позволят нам обозначить два существенно разных процесса. Это понятия: «адресное и безадресное шифрование». Также в целях ясности мы разделим понятия «шифрование» и «подписание».
Адресное шифрование — это такой случай, когда получатель и отправитель известны друг другу, оба разбираются в шифровании и у обоих есть цифровая подпись. Например, два друга, которые решили обмениваться секретными сообщениями.
В этом случае отправитель и получатель предварительно обмениваются своими публичными ключами. Затем отправитель подписывает файлы своей подписью с применением публичного ключа получателя (указав публичный ключ получателя в поле «Зашифровать для» или «Encrypt to»). Получив файл, подписанный его собственным публичным ключом, получатель расшифровывает его своим приватным ключом. Никто другой, не имеющий приватного ключа получателя, расшифровать файл не сможет, в том числе даже сам отправитель. Однако такой файл будет отображать данные подписи отправителя, которой он подписан.
Отправитель может зашифровать файл и для самого себя, указав в качестве публичного ключа получателя свой собственный ключ.
В результате такого процесса создается то, что называется «встроенной подписью». Обычно это файл формата .pgp, .gpg и .asc.
В строгом смысле слова, такой процесс правильней называть не подписанием, а шифрованием, и именно так мы и будем его называть в дальнейшем.
Безадресное шифрование (подписание). Мы не всегда имеем возможность предварительно получить отрытый ключ получателя. Многие наши получатели просто испугаются таких слов как «асимметричное шифрование» или «пришли мне твой паблик кей». Например, это случай, когда представитель госучреждения по закону обязан подписать документ электронной подписью, а получатель с основами шифрования не знаком. Или когда представитель крупной компании публикует в интернете сообщение для очень широкого круга лиц, которым важно при том понимать, что опубликовал его именно он. Или если мы хотим слать сообщения нашим близким, так, чтобы наши близкие могли быть уверены, что их отправили именно мы, а не мошенники, не используя при этом сложного ПО для расшифровки.
В таких случаях создается то, что называется «отделенной подписью» в формате .sig или .asc. Отделенная подпись создается без указания ключа получателя и проверяется с помощью публичного ключа самого отправителя. Отправитель просто подписывает файл и отправляет получателю свой публичный ключ вместе с подписанным файлом и файлом подписи. Если потенциальных получателей много, то отправитель просто публикует свой публичный ключ в интернете. Сверив публичный ключ отправителя с файлом подписи, получатель сможет удостовериться в личности отправителя и проверить, не были ли внесены в исходный файл какие-то изменения.
В дальнейшем мы будем называть «подписанием» именно безадресную отделенную подпись, а адресную встроенную подпись будем называть «шифрованием». Подобное разделение терминов «подписание» и «шифрование» вы встретите например в интерфейсе Kleopatra GPG4Win.
GPG4win может использоваться и для подписания, и для шифрования, а OpenKeychain только для шифрования. К сожалению, это один из аспектов проблем совместимости программного обеспечения на основе Open PGP.
Закон об электронных цифровых подписях
В законе выделяется три вида электронных цифровых подписей (ЭЦП).
Простая электронная подпись (ПЭП) — это идентификатор, который, посредством использования кодов или паролей, подтверждает факт подписания документа определенным лицом. Простой электронной подписью признается, например, email.
Неквалифицированная электронная подпись (НЭП) — использует криптографическое шифрование; позволяет добавить идентификаторы лица, подписавшего электронный документ; позволяет обнаружить факт внесения изменений в электронный документ после его подписания. НЭП может быть изготовлена любым лицом, разбирающемся в криптографическом шифровании.
Квалифицированная электронная подпись (КЭП) — это подпись, предоставляемая аккредитованными удостоверяющими центрами, которые юридически подтверждают принадлежность подписи конкретному лицу.
Если вы сами или с чьей-то помощью создаете электронную подпись с помощью GPG, такая подпись является неквалифицированной электронной подписью.
Юридическая значимость неквалифицированной электронной подписи
По закону электроный документ, подписанный простой электронной подписью или неквалифицированной электронной подписью, признается равнозначным документу на бумажном носителе, подписанному собственноручной подписью, в случае соглашения между участниками электронного взаимодействия, оформленного должным образом (Статья 6, пункт 2).
GPG4win *
* На момент написания статьи GPG4win-5.0.0
Установка
Скачайте и установите Gpg4win с официального сайта https://gpg4win.org При установке достаточно выбрать компоненты GnuPG и Kleopatra (пользовательский интерфейс).
Kleopatra
Запустите Kleopatra (установленное приложение, компонент GPG4win).
В «Настройках» (Setting) выберите язык: русский.
Создание сертификата электронной подписи
Для создания сертификата электронной подписи выберите «Файл» — «Создать пару ключей OpenPGP».
В открывшемся окне укажите ваше имя и ваш email. Это данные, которые будут идентифицировать вас как владельца электронной подписи. Потом их нельзя будет изменить, можно будет только добавить к сертификату еще один идентификатор или удалить сертификат.
Для тестового ключа пароль можно не задавать, но для реального он обязателен.
Все остальное можно оставить без изменений.
Срок действия сертификата можно будет изменить позже, в том числе на «неограниченный», выбрав в меню «Сертификаты» — «Изменить окончание периода действия». Чтобы сразу задать неограниченный срок, уберите галочку из этого поля.
Экспорт публичного ключа
Нажмите на созданную электронную подпись. Нажмите на кнопку «Сертификаты» на панели инструментов, или нажмите «Файл» — «Экспорт». Сохранится публичный ключ подписи в формате .asc, .gpg или .pgp. Его можно открыть в «Блокноте» в формате .txt, нажав на него правой кнопкой мыши и выбрав «Открыть с помощью» - «Блокнот».
Экспорт приватного ключа
Нажмите на созданную электронную подпись. Нажмите «Файл» — «Резервное копирование закрытых ключей», сохраните приватный ключ в формате .asc, .gpg, .pgp. Его также можно открыть в «Блокноте».
Импорт подписи
Чтобы загрузить ранее сохраненную подпись, нажмите «Импорт», выберите ключ и нажмите «Открыть».
Подписание документов (отсоединенная подпись)
Нажмите кнопку «Подписать/Зашифровать» на панели инструментов.
Выберите файл для подписания (любого формата).
Оставьте галочку около поля «Сертификат подписи» и уберите около поля «Зашифровать», выберите созданный сертификат электронной подписи, выберите папку и название файла подписи и нажмите «Подписать».
Файл отделенной подписи сохранится с тем именем и в той папке, где вы его сохранили, с расширением (.sig или .pgp)
Шифрование документов (встроенная подпись)
Нажмите кнопку «Подписать/Зашифровать» на панели инструментов.
Выберите файл. Снимите галочку возле поля «Сертификат подписи». В поле «Зашифровать для других» выберите сертификат вашего адресата и нажмите «Зашифровать». Зашифрованный файл сохранится с тем именем и в той папке, где вы его сохранили, с расширением (.pgp).
GnuPG
Не всегда все нужные операции можно выполнить во фронтенде. В таких случаях можно использовать программное обеспечение через командную строку. В меню «Start» Windows в поиске введите cmd. Откройте Command Promt.
Введите команды:
cd \ — перейти в корневую директорию диска С (не обязательно, можно работать из любой директории)
mkdir temp — создать папку temp (или любую другую)
cd temp — перейти в папку temp
В Проводнике скопируйте файлы, которые вы хотите подписать или зашифровать, в созданную папку temp.
Команды CnuPG:
gpg --list-keys — вывести список ключей
gpg --list-secret-keys — вывести список секретных ключей
-d — расшифровать
-o — команда для подписи .sig, .gpg или .pgp
-a или -armor — создание подписи в ASCII формате (текстовом)
--sign —armor — встроенная подпись .asc
--detach-sign —armor — отсоединенная подпись .asc
-u (--local-user) — для указания ключа подписи
-r (--recipient) — получатель, указывается только при шифровании (encrypt). Для обычного подписания получатель не указывается.
Отсоединенные подписи:
gpg --detach-sign -u имяподписи -o имяфайла.sig имяфайла — .sig
gpg --detach-sign -u имяподписи -o имяфайла.gpg имяфайла — .gpg
gpg --detach-sign -u имяподписи -o имяфайла.pgp имяфайла — .pgp
gpg --detach-sign --armor -u имяподписи -o имяфайла.asc имяфайла — .asc
Встроенные подписи:
gpg --sign --armor -u имяподписи -o имяфайла.asc имяфайла — встроенная подпись .asc
gpg --sign -u имяподписи -o имяфайла.gpg имяфайла — встроенная подпись .gpg / pgp
Шифрование (форматы .gpg / .pgp / .asc)
gpg --sign --encrypt -u имяподписи -o имяфайла.gpg имяфайла
gpg --sign --encrypt -u имяподписиотправителя -r имяподписиполучателя -o имяфайла.gpg имяфайла — зашифровать для
Полные списки команд можно найти в интернете.
Примеры:
Подписать файл file.docx отсоединенной подписью .sig с помощью сертификата Key1: gpg --detach-sign -u Key1 -o file.sig file.docx
Зашифровать файл file.docx в формате .pgp с помощью сертификата My Key c email mymail@myname.com: gpg --sign --encrypt -u mymail@myname.com -o file .gpg file.docx
Во втором примере в качестве имени подписи мы используем email или Key ID сертификата, потому что название состоит не из одного, а из двух слов, а знаки прочитываются только до первого пробела.
OpenKeychain
Скачайте и установите OpenKeychain: https://www.openkeychain.org или GooglePlay
Создание электронной подписи
Нажмите «Create my key» (Создать подпись), укажите имя и email, которые будут идентифицировать вас.
Импорт подписи
Нажмите значок «Плюс» в правом нижнем углу. В открывшемся меню выберите «Import from file» (Импортровать из файла). Нажмите на файл с подписью, которую вы хотите добавить.
Заверение импортированной подписи
Если вы импортировали публичный ключ, а не приватный, то при нажатии на подпись открывается страница подписи, шапка которой будет оранжевой. Для того, чтобы она стала зеленой, нужно подтвердить импортированную подпись. Для этого нужно нажать на четыре точки в верхнем правом углу и выбрать «Confirm with fingeprint» (Подтвердить фингерпринтом). В открывшемся окне сравните фингерпринт (цифровой идентифиатор) подписи, и, если он совпадает, нажмите «Fingeprint match».
Другие действия с подписью
Нажмите на подпись. На открывшеся странице нажмите на четыре точки в верхнем правом углу и выберите «Advanced». В открывшемся окне вы сможете скопировать Key ID, фингерпринт, поделиться, а также посмотреть приватный и публичный ключи в разделе Subkeys.
Зашифровать файл
Нажмите на созданную подпись и на открывшейся странице выберите значок папки с замочком, первый слева. Или нажмите «Encrypt/Decrypt».
На следующей странице выберите подпись адресата в поле Encrypt to (зашифровать для), выберите свою подпись, добавьте файл, который вы хотите зашифровать, и нажмите в правом верхнем углу значок «Сохранить» или значок «Поделиться», если вы хотите сразу отправить зашифрованный файл.
Укажите название для файла.
Расшифровать файл
Нажмите на четыре полоски в левом верхнем углу и выберите «Encrypt/Decrypt». В поле «Decrypt» (Рашифровать) выберите файл для расшифровывания.
Видеоинструкция:
Дополнительно
Размещение публичного ключа в интернете
В дополнение вы можете загрузить ваш публичный ключ на специальный сервер, например https://keys.openpgp.org. Тогда любой сможет найти ваш публичный ключ по его фингерпринт, Key ID или вашему email, и сверить с вашей подписью.
Загрузить ключ на keys.openpgp.org можно также в OpenKeychain. Для этого нажмите на подпись, на странице подписи нажмите на четыре точки в правом верхнем углу и выберите «Advanced», затем «Share», затем «Publish on keyserver». На открывшейся странице нажмите «Upload To Keyserver». Подтвердите email, нажав ссылку в пришедшем сообщении.
В OpenKeychain можно также выгрузить подпись из keys.openpgp.org, нажав на кнопку «Плюс» и выбрав поиск в облаке. Затем введите email или Key ID подписи.
Кроме этого, если у вас есть сайт, вы можете написать для него программу, которая будет проверять вашу подпись, то есть сверять подписанные вами документы, загружаемые пользователем, с вашим публичным ключом, предварительно загруженным вами на ваш сервер. Тогда получатель сможет проверять вашу подпись на вашем сайте. Вы можете заказать такую программу у программистов или создать с помощью нейросети, это не очень сложно.
Другие способы работы с подписями OpenPGP
Возможности работы с OpenPGP можно найти на сайте https://8gwifi.org.
Проблемы совместимости
Существуют некоторые проблемы совместимости между OpenPGP программным обеспечением, из-за чего подписи, созданные в одной программе, могут не открываться в другой. Об этом мы написали подробно в другой статье. Так, отсоединенные подписи, созданные в GPG4Win, скорее всего не откроются в OpenKeychain.
Выше мы уже сказали об одной из таких проблем: GPG4Win создает и читает и подписанные, и зашифрованные файлы различных форматов, а OpenKeychain только зашифрованные.
Можно сказать что в целом встроенная цифровая подпись форматов .pgp и .gpg более совместима в разных программах, чем отсоединенная .sig и .asc. Также, для более старого ПО алгоритм RSA может быть более совместимым, чем ECC (curve).
Универсальная подпись
Нет никаких проблем, если вы хотите обменироваться подписанными и/или зашифрованными файлами с использованием одной и той же программы (только OpenKeychain или только GPG4Win) или предоставляете пользователям возможность проверки вашей подписи у себя на сайте.
Также нет проблем, если вы хотите использовать адресное шифрование (встроенную подпись) и имеете публичный ключ адресата: скорее всего, вы сможете и зашифровать, и расшифровать такой файл и в GPG4Win, и в OpenKeychain. (Заметим, что совместимость будет лучше, если файл будет создан в OpenKeychain, так как он использует более старые алгоритмы, чем GPG4Win).
Однако, если у вас нет публичного ключа адресата, то отправить зашифрованный файл, который будет гарантированно открываться в разных программах, не очень просто.
Экспериментально мы установили, как создать зашифрованный файл, не имея публичного ключа получателя, который будет открываться и в OpenKeychain, и в GPG4Win.
В OpenKeychain создайте вашу личную подпись (mykey), с вашими именем и email. Затем в GPG4Win создайте вторую подпись, для получателя (userkey), которая не будет включать ваши личные идентификаторы и не будет включать никакой email (в OpenKeychain невозможно создать сертификат без email), и затем импортируйте эту подпись в OpenKeychain.
Зашифруйте файл (file.docx) в OpenKeychain, указав в качестве подписи свою именную подпись (mykey), а в поле «для кого» (Encrypt to) созданную вами подпись получателя (userkey).
Отправьте получателю оригинальный файл (file.docx), файл с вашей подписью (file.asc), публичный ключ своей подписи (mykey_public.asc) и файл в формате .txt содержащий публичный и приватный ключ созданной вами подписи получателя (userkey.txt) либо просто приватный ключ подписи получателя (userkey_secret.asc)
Инструкция для получателя: проверить электронную подпись можно с помощью программ: GPG4win (для Windows), OpenKeychain (для Android). Для этого импортируйте файл userkey.txt (или userkey_secret.asc), импортируйте публичный ключ отправителя mykey_public.asc, затем выберите «Расшифровать/проверить» (Decrypt/Verify) и укажите файл file.docx.
Зашифрованный таким образом файл будет читаться и открываться и в GPG4Win, и в OpenKeychain. Однако, если вы хотите создать отсоединенную цифровую подпись, то проверять ее подлинность пользователь сможет только в GPG4Win.
Заключение
В данном обзоре мы ограничились описанием общих понятий и работы с цифровой подписью в отдельных программах. Эта статья адресована в основном тем, кто хотел бы научиться самостоятельно создавать и использовать электронную подпись для цифрового электронного взаимодействия с клиентами и бизнес-партнерами. Однако, этим далеко не исчерпывается тема цифровых подписей, асимметричного шифрования и цифровой безопасности. Мы хотели бы, чтобы вопросы цифровой безопасности не пугали, а вызывали интерес, желание понять и начать применять теорию в практике. Мы со своей стороны продолжим изучение и популяризацию данной темы.