id: Гость   вход   регистрация
текущее время 21:40 28/03/2024
Владелец: Alex_B (создано 26/12/2007 14:34), редакция от 23/01/2008 13:35 (автор: Alex_B) Печать
Категории: криптография, инфобезопасность, разное
создать
просмотр
редакции
ссылки

OpenPGP для C# . Net


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


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


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


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


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


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


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



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

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


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


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


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


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



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



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



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



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



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


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


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


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


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



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



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



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



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



 
— Java (11/04/2008 11:44)   <#>
Респект и уважуха, перевёл себе на java, кучу вроемени сыкономил.
— Гость (06/11/2009 15:02)   <#>
"Стоит отметить, что наше приложение выводит id ключей в десятеричной системе исчисления, а та же winPT в шестнадцатеричном. Вы можете проверить корректность вывода, скажем при помощи стандартного калькулятора windows – переведите число в нужную систему счисления."

неочевидно, перевела калькулятором отрицательное число в hex систему счисления, получила совсем не то что показывает GPG
— Viktorianka (09/11/2009 15:54)   <#>
за обзор и ссылку на bcpp спасибо, но пример с подписыванием файла в статье не рабочий, gnupg подпись не принимает, буду разбираться с примерами из дистрибутива bcpp
— Гость (17/12/2009 13:44)   <#>
пример рабочий. практически на этом примере работает timeMarker.org
— KY3EH (11/03/2010 19:42)   профиль/связь   <#>
комментариев: 2   документов: 0   редакций: 0
Доброго времени суток!

Столкнулся с проблемой:
На Java библиотеках от Bouncy Castle реализована утилита подписи и шифрования файла.
Результат прекрасно расшифровывается утилитой GPG (GnuPG), а при использование,
для расшифровки PGPfreeware 6.5.8 выдает ошибку "encrypted session key is bad"
Сталкивался ли кто либо с этой проблемой и, если сталкивался, то как решили?
— KY3EH (11/03/2010 19:57)   профиль/связь   <#>
комментариев: 2   документов: 0   редакций: 0
Viktorianka, если вдруг еще актуально, то вот код метода на Java, для подписи:

Вроде работает.
— Тагиров_Артур (30/04/2010 11:27)   <#>
Добрый день.
А никто не использовал эту библиотеку для генерации "прозрачной подписи" (text-armored), а не clear-sign? Никак не могу сообразить с какого боку подойти.
OnePassSignature как я понимаю эквивалентна detach-sign в GnuPG, или я не прав?
— SATtva (01/05/2010 12:48)   профиль/связь   <#>
комментариев: 11558   документов: 1036   редакций: 4118
"Прозрачная подпись" — это и есть clearsign. Armored text — это данные, конвертированные в Radix-64. Что такое OnePassSignature, читайте в стандарте.
— Тагиров_Артур (04/05/2010 10:01)   <#>
Немного описался, хотел написать "непрозрачная подпись" (text-armored)... Имеется в виду подпись, которая получается при использовании ключа --sign в pgp например (ну естественно еще с -armor, за что, как я понимаю, отвечает ArmoredOutputStream).
Правильно я тогда понимаю, что такая подпись просто не содержит ClearText?
— SATtva (04/05/2010 11:34)   профиль/связь   <#>
комментариев: 11558   документов: 1036   редакций: 4118
А как без исходного текста сверялась бы подпись? Открытый текст есть, но конвертирован в Radix-64.
— Тагиров_Артур (04/05/2010 12:50)   <#>
Да, исходный текст хранится в LiteralDataPacket...
По всей видимости я нашел ответ на свой вопрос. Пример кода, как сделать нужную мне подпись (не --clearsign -armor, а --sign -armor) можно посмотреть в примерах библиотеки BouncyCastle в классе SignedFileProcessor.
Ваша оценка документа [показать результаты]
-3-2-1 0+1+2+3