<?xml version="1.0" encoding="cp1251"?>
<?xml-stylesheet type="text/css" href="http://www.pgpru.com/styles/atom.css" media="screen"?>
<rss version="2.0">
<channel>
<title>openPGP в России/Черновики/Статьи/OpenPGPдляC</title>
<link>http://www.pgpru.com/%D7%E5%F0%ED%EE%E2%E8%EA%E8/%D1%F2%E0%F2%FC%E8/OpenPGP%E4%EB%FFC</link>
<description>История изменений документа Черновики/Статьи/OpenPGPдляC</description>
<copyright>http://www.pgpru.com/%CF%F0%EE%E5%EA%F2/%CF%F0%E0%E2%E8%EB%E0</copyright>
<language>ru</language>
<image>
<title>openPGP в России</title>
<link>http://www.pgpru.com/</link>
<url>http://www.pgpru.com/images/pgpru_banner.gif</url>
<width>88</width>
<height>31</height>
</image>
<item>
<title>Редакция от 23/01/2008 13:33</title>
<link>http://www.pgpru.com/%25d7%25e5%25f0%25ed%25ee%25e2%25e8%25ea%25e8/%25d1%25f2%25e0%25f2%25fc%25e8/openpgp%25e4%25eb%25ffc/show?time=2008-01-23+13%3A33%3A43</link>
<guid isPermaLink="true">http://www.pgpru.com/%25d7%25e5%25f0%25ed%25ee%25e2%25e8%25ea%25e8/%25d1%25f2%25e0%25f2%25fc%25e8/openpgp%25e4%25eb%25ffc</guid>
<description><![CDATA[<div class="pageBefore"></div><div class="page">
<h3>Сравнение редакций документа <a href="http://www.pgpru.com/chernowiki/statji/openpgpdljac">Черновики / Статьи / Open P G Pдля C</a> от <a href="http://www.pgpru.com/chernowiki/statji/openpgpdljac?time=2008-01-23+13%3A33%3A43">23/01/2008 13:33</a> и <a href="http://www.pgpru.com/chernowiki/statji/openpgpdljac">23/01/2008 13:35</a></h3>
<br />
<h2>Удалено:</h2><br />
<div class="deletions"><div class="indent"><div class="indent"><div class="indent"><div class="indent">pgpSec. GetSecretKeyRing(keyId);</div></div></div></div>
pgpSec = PgpSecretKeyRingBundle. RemoveSecretKeyRing(</div><br />
<h2>Добавлено:</h2><br />
<div class="additions"><div class="indent"><div class="indent"><div class="indent"><div class="indent">pgpSec. GetSecretKeyRing(keyId);<!--notypo--><textarea class="code" cols="80" rows="2" wrap="off" readonly="readonly"></textarea><!--/notypo-->pgpSec = PgpSecretKeyRingBundle. RemoveSecretKeyRing(</div></div></div></div></div></div>
]]></description>
<pubDate>Wed, 23 Jan 2008 13:33:43 +0300</pubDate>
</item>
<item>
<title>Редакция от 23/01/2008 13:32</title>
<link>http://www.pgpru.com/%25d7%25e5%25f0%25ed%25ee%25e2%25e8%25ea%25e8/%25d1%25f2%25e0%25f2%25fc%25e8/openpgp%25e4%25eb%25ffc/show?time=2008-01-23+13%3A32%3A47</link>
<guid isPermaLink="true">http://www.pgpru.com/%25d7%25e5%25f0%25ed%25ee%25e2%25e8%25ea%25e8/%25d1%25f2%25e0%25f2%25fc%25e8/openpgp%25e4%25eb%25ffc</guid>
<description><![CDATA[<div class="pageBefore"></div><div class="page">
<h3>Сравнение редакций документа <a href="http://www.pgpru.com/chernowiki/statji/openpgpdljac">Черновики / Статьи / Open P G Pдля C</a> от <a href="http://www.pgpru.com/chernowiki/statji/openpgpdljac?time=2008-01-23+13%3A32%3A47">23/01/2008 13:32</a> и <a href="http://www.pgpru.com/chernowiki/statji/openpgpdljac?time=2008-01-23+13%3A33%3A43">23/01/2008 13:33</a></h3>
<br />
<h2>Удалено:</h2><br />
<div class="deletions">Вы уже знаете, как можно узнать какие ключи находятся в хранилище из заметки «Просмотр хранилища ключей»</div><br />
<h2>Добавлено:</h2><br />
<div class="additions">Вы уже знаете, как можно узнать какие ключи находятся в хранилище из заметки «<a href="https://www.pgpru.com/chernowiki/statji/openpgpdljac#h20291-2" target="_blank" title="" class="outerlink">Просмотр хранилища ключей</a>»</div></div>
]]></description>
<pubDate>Wed, 23 Jan 2008 13:32:47 +0300</pubDate>
</item>
<item>
<title>Редакция от 29/12/2007 16:03</title>
<link>http://www.pgpru.com/%25d7%25e5%25f0%25ed%25ee%25e2%25e8%25ea%25e8/%25d1%25f2%25e0%25f2%25fc%25e8/openpgp%25e4%25eb%25ffc/show?time=2007-12-29+16%3A03%3A36</link>
<guid isPermaLink="true">http://www.pgpru.com/%25d7%25e5%25f0%25ed%25ee%25e2%25e8%25ea%25e8/%25d1%25f2%25e0%25f2%25fc%25e8/openpgp%25e4%25eb%25ffc</guid>
<description><![CDATA[<div class="pageBefore"></div><div class="page">
<h3>Сравнение редакций документа <a href="http://www.pgpru.com/chernowiki/statji/openpgpdljac">Черновики / Статьи / Open P G Pдля C</a> от <a href="http://www.pgpru.com/chernowiki/statji/openpgpdljac?time=2007-12-29+16%3A03%3A36">29/12/2007 16:03</a> и <a href="http://www.pgpru.com/chernowiki/statji/openpgpdljac?time=2008-01-23+13%3A32%3A47">23/01/2008 13:32</a></h3>
<br />
<h2>Добавлено:</h2><br />
<div class="additions"><a name="h20291-1"></a><h2>Удаление (добавление) ключа из хранилища</h2>
Вы уже знаете, как можно узнать какие ключи находятся в хранилище из заметки «Просмотр хранилища ключей»<br />
Теперь рассмотрим, как можно удалить и добавить связку ключей в хранилище.<br />
На деле, удаление и добавление связки ключей, очень похожие операции. Поэтому для краткости и упрощения кода будем удалять связку &mdash; для добавления нам бы потребовалось в начале создать ключи.<br />
И так, первым делом прочитаем хранилище ключей. Эта операция вам уже знакома.<br />
string path = @"secring_bak3.gpg";<br />
Stream BundleStream = File. OpenRead(path);<br />
BundleStream =<br />
PgpSecretKeyRingBundle pgpSec =<br />
BundleStream. Close();<!--notypo--><textarea class="code" cols="80" rows="2" wrap="off" readonly="readonly">Теперь получим связку, которую хотим удалить, для этого нужно знать уникальный идентификатор. Обычно он представляется в шестнадцатеричном формате, но здесь он должен быть в десятеричном.</textarea><!--/notypo-->// получим связку ключей по уникальному ID<br />
PgpSecretKeyRing pgpKeyRing =<br />
<div class="indent"><div class="indent"><div class="indent"><div class="indent">pgpSec. GetSecretKeyRing(keyId);</div></div></div></div>
Непосредственно удаление:<br />
pgpSec = PgpSecretKeyRingBundle. RemoveSecretKeyRing(<br />
<div class="indent"><div class="indent"><div class="indent"><div class="indent">pgpSec, pgpKeyRing);</div></div></div></div>
/*<br />
вот как выглядит добавление ключа<br />
PgpSecretKeyRingBundle. AddSecretKeyRing(pgpSec, pgpKeyRing);<br />
*/<!--notypo--><textarea class="code" cols="80" rows="2" wrap="off" readonly="readonly">Вот и все, осталось только сохранить изменения. Для этого надо лишь передать методу Encode() объекта хранилища ключей поток и он запишет в него нужную информацию.</textarea><!--/notypo-->// Запишем хранилище ключей<br />
Stream NewBundleStream = File. OpenWrite(@"new_secring_bak.gpg");<br />
pgpSec. Encode(NewBundleStream);<br />
NewBundleStream. Close();%%<br />
Соберем все вместе.<br />
<div class="indent"><div class="indent"><div class="indent"><div class="indent">Console. WriteLine("<strong>Удаление связки ключей</strong>\n");<br />
// путь до хранилища секретных ключей<br />
string path = @"secring_bak3.gpg";<br />
// прочитаем хранилище ключей<br />
Stream BundleStream = File. OpenRead(path);<br />
BundleStream =<br />
PgpSecretKeyRingBundle pgpSec =<br />
BundleStream. Close();<br />
// получим связку ключей по уникальному ID<br />
long keyId = -7764185142489588446;<br />
PgpSecretKeyRing pgpKeyRing =<br />
<div class="indent"><div class="indent"><div class="indent"><div class="indent">pgpSec. GetSecretKeyRing(keyId);<br />
</div></div></div></div>// удалим связку<br />
pgpSec =<br />
<div class="indent"><div class="indent"><div class="indent"><div class="indent">PgpSecretKeyRingBundle. RemoveSecretKeyRing<br />
(pgpSec, pgpKeyRing);<br />
<br />
</div></div></div></div>// Запишем хранилище ключей<br />
Stream NewBundleStream =<br />
<div class="indent"><div class="indent"><div class="indent"><div class="indent">File. OpenWrite(@"new_secring_bak.gpg");<br />
<br />
</div></div></div></div>pgpSec. Encode(NewBundleStream);<br />
NewBundleStream. Close();</div></div></div></div>
 <br />
<div class="indent"><div class="indent"><div class="indent"><div class="indent">Console. ReadLine();</div></div></div></div></div></div>
]]></description>
<pubDate>Sat, 29 Dec 2007 16:03:36 +0300</pubDate>
</item>
<item>
<title>Редакция от 26/12/2007 15:54</title>
<link>http://www.pgpru.com/%25d7%25e5%25f0%25ed%25ee%25e2%25e8%25ea%25e8/%25d1%25f2%25e0%25f2%25fc%25e8/openpgp%25e4%25eb%25ffc/show?time=2007-12-26+15%3A54%3A49</link>
<guid isPermaLink="true">http://www.pgpru.com/%25d7%25e5%25f0%25ed%25ee%25e2%25e8%25ea%25e8/%25d1%25f2%25e0%25f2%25fc%25e8/openpgp%25e4%25eb%25ffc</guid>
<description><![CDATA[<div class="pageBefore"></div><div class="page">
<h3>Сравнение редакций документа <a href="http://www.pgpru.com/chernowiki/statji/openpgpdljac">Черновики / Статьи / Open P G Pдля C</a> от <a href="http://www.pgpru.com/chernowiki/statji/openpgpdljac?time=2007-12-26+15%3A54%3A49">26/12/2007 15:54</a> и <a href="http://www.pgpru.com/chernowiki/statji/openpgpdljac?time=2007-12-29+16%3A03%3A36">29/12/2007 16:03</a></h3>
<br />
<h2>Добавлено:</h2><br />
<div class="additions"><a name="h20291-1"></a><h2>Подписание строки (ЭЦП)</h2>
В данной заметке мы выдадим ЭЦП для произвольной строки. Результатом работы нашей программы будет файл, содержащий подпись в формате openPGP, оформленный по всем стандартам.<br />
Как и в первой статье цикла («Просмотр хранилища ключей») будем использовать библиотеку от «<a href="http://www.bouncycastle.org/" target="_blank" title="" class="outerlink">The Legion of the Bouncy Castle</a>».<br />
Вы уже знаете как обращаться с хранилищем секретных ключей:<br />
<!--notypo--><textarea class="code" cols="80" rows="7" wrap="off" readonly="readonly">// путь до хранилища секретных ключей
string path = @&quot;secring_bak.gpg&quot;;
// прочитаем хранилище ключей
Stream BundleStream  =  File.OpenRead(path);
BundleStream  =  PgpUtilities.GetDecoderStream(BundleStream);
PgpSecretKeyRingBundle pgpSec  = new PgpSecretKeyRingBundle(BundleStream);</textarea><!--/notypo--><br />
Теперь нужно найти ключ, на котором мы будем подписывать. Напомню, что PGP-ключ состоит из 2-х половинок: секретного и открытого ключей.<br />
Для того чтобы использовать секретную половинку нужно указать пароль доступа. Приведенный ниже код выполняет поиск PGP-ключа и указывает пароль для секретной половинки.<br />
<!--notypo--><textarea class="code" cols="80" rows="8" wrap="off" readonly="readonly">// отыщем ключ по уникальному идентификатору
long keyId = -7764185142489588446;
PgpSecretKey pgpSecKey = pgpSec.GetSecretKey(keyId);
// для доступа к секретному ключу нужно указать пароль
string pass = &quot;1&quot;;
PgpPrivateKey pgpPrivKey =
    pgpSecKey.ExtractPrivateKey(pass.ToCharArray());</textarea><!--/notypo--><br />
Далее следует создать объект генератора подписи, предварительно выбрав алгоритм хеширования:<br />
<!--notypo--><textarea class="code" cols="80" rows="8" wrap="off" readonly="readonly">// для генерации подписи нужно выбрать
// функцию хеширования, в данном случае Sha1
HashAlgorithmTag digest = HashAlgorithmTag.Sha1;
// создадим объект генератора подписи
PgpSignatureGenerator sGen = new PgpSignatureGenerator(
    pgpSecKey.PublicKey.Algorithm, digest);
sGen.InitSign(PgpSignature.CanonicalTextDocument, pgpPrivKey);</textarea><!--/notypo--><br />
На этом подготовительные операции заканчиваются. Определим строку, которую хотим подписать, а также файл для хранения подписи в нужном формате. Корректность подписи из такого файла можно проверить стандартными средствами, например для windows можно использовать winPT.<br />
<!--notypo--><textarea class="code" cols="80" rows="18" wrap="off" readonly="readonly">// строку, которую будем подписывать,
// необходимо представить в виде массива байт
string str = &quot;12привет&quot;;
byte[] byteStr = Encoding.UTF8.GetBytes(str);
// файл для хранения прозрачной подписи
Stream fos = File.Create(&quot;my_sign.asc&quot;);
// непосредственно подписание
sGen.Update(byteStr);
// формирование файла, нужного вида
ArmoredOutputStream aOut = new ArmoredOutputStream(fos);
aOut.BeginClearText(digest);
aOut.Write(byteStr);
aOut.Write((byte)'\r');
aOut.Write((byte)'\n');
aOut.EndClearText();
BcpgOutputStream bOut = new BcpgOutputStream(aOut);
sGen.Generate().Encode(bOut);</textarea><!--/notypo--><br />
Собирем весь код вместе:<br />
using Org. BouncyCastle. Bcpg;<br />
using System. Collections;<br />
class Program<br />
static void Main(string[] args)<br />
<div class="indent"><div class="indent">Console. WriteLine("<strong>Подпишим строку</strong>\n");<br />
// путь до хранилища секретных ключей<br />
string path = @"secring_bak.gpg";<br />
// прочитаем хранилище ключей<br />
Stream BundleStream = File. OpenRead(path);<br />
BundleStream =<br />
<div class="indent"><div class="indent">PgpUtilities. GetDecoderStream(BundleStream);<br />
</div></div>PgpSecretKeyRingBundle pgpSec =<br />
<div class="indent"><div class="indent">new PgpSecretKeyRingBundle(BundleStream);<br />
</div></div>// отыщем ключ по уникальному идентификатору<br />
long keyId = -7764185142489588446;<br />
PgpSecretKey pgpSecKey = pgpSec. GetSecretKey(keyId);<br />
// для доступа к секретному ключу нужно указать пароль<br />
string pass = "pass";<br />
PgpPrivateKey pgpPrivKey =<br />
<div class="indent"><div class="indent">pgpSecKey. ExtractPrivateKey(pass. ToCharArray());<br />
</div></div>// для генерации подписи нужно выбрать<br />
// функцию хеширования, в данном случаи Sha1<br />
HashAlgorithmTag digest = HashAlgorithmTag. Sha1;<br />
PgpSignatureGenerator sGen = new PgpSignatureGenerator(<br />
<div class="indent"><div class="indent">pgpSecKey. PublicKey. Algorithm, digest);<br />
</div></div>sGen. InitSign(<br />
<div class="indent"><div class="indent">PgpSignature. CanonicalTextDocument, pgpPrivKey);<br />
</div></div>// строку, которую будем подписывать,<br />
// необходимо представить в виде массива байт<br />
string str = "12привет";<br />
byte[] byteStr = Encoding. UTF8. GetBytes(str);<br />
// файл для хранения прозрачной подписи<br />
Stream fos = File. Create("my_sign.asc");<br />
// непосредственно подписание<br />
sGen. Update(byteStr);<br />
// формирование файла, нужного вида<br />
ArmoredOutputStream aOut = new ArmoredOutputStream(fos);<br />
aOut. BeginClearText(digest);<br />
aOut. Write(byteStr);<br />
aOut. Write((byte)'\r');<br />
aOut. Write((byte)'\n');<br />
aOut. EndClearText();<br />
BcpgOutputStream bOut = new BcpgOutputStream(aOut);<br />
sGen. Generate(). Encode(bOut);<br />
aOut. Close();<br />
fos. Close();<br />
Console. ReadLine();</div></div>
}}}<!--notypo--><textarea class="code" cols="80" rows="2" wrap="off" readonly="readonly">В итоге у нас получился файл следующего вида:</textarea><!--/notypo--><hr />BEGIN PGP SIGNED MESSAGE<hr />
Hash: SHA1<br />
12привет<br />
<hr />BEGIN PGP SIGNATURE<hr />
Version: BCPG v1.32<br />
iEYEARECAAYFAkd2NP0ACgkQlEASv9OK3SL0+wCeNq2PKsTZcGmJzbixpcMx8N1J<br />
bSIAoKX9ERFgDOJaPO6FWm1OcBGbudaV<br />
=Hw18<br />
<hr />END PGP SIGNATURE<hr />%%</div></div>
]]></description>
<pubDate>Wed, 26 Dec 2007 15:54:49 +0300</pubDate>
</item>
<item>
<title>Редакция от 26/12/2007 14:40</title>
<link>http://www.pgpru.com/%25d7%25e5%25f0%25ed%25ee%25e2%25e8%25ea%25e8/%25d1%25f2%25e0%25f2%25fc%25e8/openpgp%25e4%25eb%25ffc/show?time=2007-12-26+14%3A40%3A27</link>
<guid isPermaLink="true">http://www.pgpru.com/%25d7%25e5%25f0%25ed%25ee%25e2%25e8%25ea%25e8/%25d1%25f2%25e0%25f2%25fc%25e8/openpgp%25e4%25eb%25ffc</guid>
<description><![CDATA[<div class="pageBefore"></div><div class="page">
<h3>Сравнение редакций документа <a href="http://www.pgpru.com/chernowiki/statji/openpgpdljac">Черновики / Статьи / Open P G Pдля C</a> от <a href="http://www.pgpru.com/chernowiki/statji/openpgpdljac?time=2007-12-26+14%3A40%3A27">26/12/2007 14:40</a> и <a href="http://www.pgpru.com/chernowiki/statji/openpgpdljac?time=2007-12-26+15%3A54%3A49">26/12/2007 15:54</a></h3>
<br />
<h2>Удалено:</h2><br />
<div class="deletions">Стоит отметить, что наше приложение выводит id ключей в десятеричной системе исчисления, а та же winPT в шестнадцатеричном. Вы можете проверить корректность вывода, скажем при помощи стандартного калькулятора windows – переведите число в нужную систему исчисления.</div><br />
<h2>Добавлено:</h2><br />
<div class="additions">Стоит отметить, что наше приложение выводит id ключей в десятеричной системе исчисления, а та же winPT в шестнадцатеричном. Вы можете проверить корректность вывода, скажем при помощи стандартного калькулятора windows – переведите число в нужную систему счисления.</div></div>
]]></description>
<pubDate>Wed, 26 Dec 2007 14:40:27 +0300</pubDate>
</item>
<item>
<title>Редакция от 26/12/2007 14:37</title>
<link>http://www.pgpru.com/%25d7%25e5%25f0%25ed%25ee%25e2%25e8%25ea%25e8/%25d1%25f2%25e0%25f2%25fc%25e8/openpgp%25e4%25eb%25ffc/show?time=2007-12-26+14%3A37%3A17</link>
<guid isPermaLink="true">http://www.pgpru.com/%25d7%25e5%25f0%25ed%25ee%25e2%25e8%25ea%25e8/%25d1%25f2%25e0%25f2%25fc%25e8/openpgp%25e4%25eb%25ffc</guid>
<description><![CDATA[<div class="pageBefore"></div><div class="page">
<h3>Сравнение редакций документа <a href="http://www.pgpru.com/chernowiki/statji/openpgpdljac">Черновики / Статьи / Open P G Pдля C</a> от <a href="http://www.pgpru.com/chernowiki/statji/openpgpdljac?time=2007-12-26+14%3A37%3A17">26/12/2007 14:37</a> и <a href="http://www.pgpru.com/chernowiki/statji/openpgpdljac?time=2007-12-26+14%3A40%3A27">26/12/2007 14:40</a></h3>
<br />
<h2>Удалено:</h2><br />
<div class="deletions"><div class="indent"><div class="indent"><div class="indent"><div class="indent"><div class="indent"><div class="indent"><div class="indent"><div class="indent"><div class="indent"><div class="indent">/*if (k. IsSigningKey)<br />
{<br />
<div class="indent"><div class="indent">Console. WriteLine(k. KeyId);<br />
</div></div>}*/</div></div></div></div></div></div></div></div></div></div></div></div>
]]></description>
<pubDate>Wed, 26 Dec 2007 14:37:17 +0300</pubDate>
</item>
<item>
<title>Редакция от 26/12/2007 14:34</title>
<link>http://www.pgpru.com/%25d7%25e5%25f0%25ed%25ee%25e2%25e8%25ea%25e8/%25d1%25f2%25e0%25f2%25fc%25e8/openpgp%25e4%25eb%25ffc/show?time=2007-12-26+14%3A34%3A55</link>
<guid isPermaLink="true">http://www.pgpru.com/%25d7%25e5%25f0%25ed%25ee%25e2%25e8%25ea%25e8/%25d1%25f2%25e0%25f2%25fc%25e8/openpgp%25e4%25eb%25ffc</guid>
<description><![CDATA[<div class="pageBefore"></div><div class="page">
<h3>Сравнение редакций документа <a href="http://www.pgpru.com/chernowiki/statji/openpgpdljac">Черновики / Статьи / Open P G Pдля C</a> от <a href="http://www.pgpru.com/chernowiki/statji/openpgpdljac?time=2007-12-26+14%3A34%3A55">26/12/2007 14:34</a> и <a href="http://www.pgpru.com/chernowiki/statji/openpgpdljac?time=2007-12-26+14%3A37%3A17">26/12/2007 14:37</a></h3>
<br />
<h2>Добавлено:</h2><br />
<div class="additions"><!--notypo--><fieldset><legend><strong> Оглавление документа:   </strong></legend><div class="toc1"><a href="#h20291-2">Просмотр хранилища ключей</a></div><div class="toc1"><a href="#h20291-3">Удаление (добавление) ключа из хранилища</a></div><div class="toc1"><a href="#h20291-4">Подписание строки (ЭЦП)</a></div></fieldset><!--/notypo--></div></div>
]]></description>
<pubDate>Wed, 26 Dec 2007 14:34:55 +0300</pubDate>
</item>
</channel>
</rss>
