OpenPGP для C# .Net


Оглавление документа:


Просмотр хранилища ключей


Данная заметка первая из планируемого цикла по использованию криптографических стандартов openPGP на платформе .Net. Предполагается, что вы знаете, что это такое и обладаете базовыми знаниями по криптографии.

Первым делом скачайте последнюю версию bccrypto-net[link1], которую предлагает проект «The Legion of the Bouncy Castle[link2]» (большое им спасибо).

Для первого примера напишем консольное приложение, которое выводит id всех секретных ключей из хранилища.

Для начала это хранилище нужно создать. Для создания и хранения ключей PGP на ос Windows есть удобная программа с графическим интерфейсом – winPT[link3]. Каждый раз после добавления нового ключа программа предлагает сохранить копию хранилища ключей в удобном для вас месте (по умолчанию для хранилища секретных ключей предлагается название secring_bak.gpg). Именно с этой копией мы будем работать.

Не забудьте добавить к проекту консольного приложения BouncyCastle.Crypto.dll.



Стоит отметить, что наше приложение выводит id ключей в десятеричной системе исчисления, а та же winPT в шестнадцатеричном. Вы можете проверить корректность вывода, скажем при помощи стандартного калькулятора windows – переведите число в нужную систему счисления.

Удаление (добавление) ключа из хранилища


Вы уже знаете, как можно узнать какие ключи находятся в хранилище из заметки «Просмотр хранилища ключей[link4]»

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

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

И так, первым делом прочитаем хранилище ключей. Эта операция вам уже знакома.




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




Непосредственно удаление:




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




Соберем все вместе.



Подписание строки (ЭЦП)


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

Как и в первой статье цикла («Просмотр хранилища ключей») будем использовать библиотеку от «The Legion of the Bouncy Castle[link2]».

Вы уже знаете как обращаться с хранилищем секретных ключей:



Теперь нужно найти ключ, на котором мы будем подписывать. Напомню, что PGP-ключ состоит из 2-х половинок: секретного и открытого ключей.
Для того чтобы использовать секретную половинку нужно указать пароль доступа. Приведенный ниже код выполняет поиск PGP-ключа и указывает пароль для секретной половинки.




Далее следует создать объект генератора подписи, предварительно выбрав алгоритм хеширования:




На этом подготовительные операции заканчиваются. Определим строку, которую хотим подписать, а также файл для хранения подписи в нужном формате. Корректность подписи из такого файла можно проверить стандартными средствами, например для windows можно использовать winPT.




Собирем весь код вместе:




В итоге у нас получился файл следующего вида:



Ссылки
[link1] http://www.bouncycastle.org/csharp/

[link2] http://www.bouncycastle.org/

[link3] http://www.pgpru.com/forum/rasshirenijaidopolnenija/winpt

[link4] https://www.pgpru.com/chernowiki/statji/openpgpdljac#h20291-2