среда, 23 января 2008 г.

OpenPGP для C# .Net (3). Удаление (добавление) ключа из хранилища

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


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



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


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



// путь до хранилища секретных ключей
string path = @"secring_bak3.gpg";
           
// прочитаем хранилище ключей
Stream BundleStream = File.OpenRead(path);
BundleStream =
        PgpUtilities.GetDecoderStream(BundleStream);

PgpSecretKeyRingBundle pgpSec =
        new PgpSecretKeyRingBundle(BundleStream);
           
BundleStream.Close()Syhi-подсветка кода
;


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



// получим связку ключей по уникальному ID
long keyId = -7764185142489588446;
PgpSecretKeyRing pgpKeyRing =
        pgpSec.GetSecretKeyRing(keyId);

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

pgpSec = PgpSecretKeyRingBundle.RemoveSecretKeyRing(
        pgpSec, pgpKeyRing);

/*
вот как выглядит добавление ключа
PgpSecretKeyRingBundle.AddSecretKeyRing(pgpSec, pgpKeyRing);
*/
Syhi-подсветка кода



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



// Запишем хранилище ключей
Stream NewBundleStream = File.OpenWrite(@"new_secring_bak.gpg");
pgpSec.Encode(NewBundleStream);
NewBundleStream.Close();Syhi-подсветка кода



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



using System;
using System.Collections.Generic;
using System.Text;
using System.IO;

using Org.BouncyCastle.Bcpg;
using Org.BouncyCastle.Bcpg.OpenPgp;

namespace ConsoleApplication2
{
class Program
{
static void Main(string[] args)
{
        Console.WriteLine("**Удаление связки ключей**\n");
           
        // путь до хранилища секретных ключей
        string path = @"secring_bak3.gpg";
           
        // прочитаем хранилище ключей
        Stream BundleStream = File.OpenRead(path);
        BundleStream =
                PgpUtilities.GetDecoderStream(BundleStream);

        PgpSecretKeyRingBundle pgpSec =
                new PgpSecretKeyRingBundle(BundleStream);
           
        BundleStream.Close();
           
           
        // получим связку ключей по уникальному ID
        long keyId = -7764185142489588446;
        PgpSecretKeyRing pgpKeyRing =
                pgpSec.GetSecretKeyRing(keyId);

        // удалим связку
        pgpSec =
                PgpSecretKeyRingBundle.RemoveSecretKeyRing
                (pgpSec, pgpKeyRing);
               
        // Запишем хранилище ключей
        Stream NewBundleStream =
                File.OpenWrite(@"new_secring_bak.gpg");
               
        pgpSec.Encode(NewBundleStream);
        NewBundleStream.Close();
 
        Console.ReadLine();
}}}Syhi-подсветка кода


Комментариев нет: