Как сохранить открытый ключ на машине уровне контейнер ключа RSA

У меня есть проблема с помощью уровня машины контейнер ключа RSA при хранении только открытого ключа пары "открытый/закрытый ключ".

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

Код работает когда CspProviderFlags.UseDefaultKeyContainer указан для CspParameters.Flags (т.е. ключевое чтение назад из контейнера PublicKey является тем же), но когда CspProviderFlags.UseMachineKeyStore указан для CspParameters.Flags ключевое чтение назад от PublicKey отличается.

Почему поведение отличается, и что я должен сделать по-другому для получения открытого ключа от машины уровня контейнер ключа RSA?

var publicPrivateRsa = new RSACryptoServiceProvider(new CspParameters()
{
    KeyContainerName = "PublicPrivateKey",
    Flags = CspProviderFlags.UseMachineKeyStore
    //Flags = CspProviderFlags.UseDefaultKeyContainer
}
    )
{
    PersistKeyInCsp = true,

};

var publicRsa = new RSACryptoServiceProvider(new CspParameters()
{
    KeyContainerName = "PublicKey",
    Flags = CspProviderFlags.UseMachineKeyStore
    //Flags = CspProviderFlags.UseDefaultKeyContainer
}
    )
{
    PersistKeyInCsp = true
};


//Export the key.
publicRsa.ImportParameters(publicPrivateRsa.ExportParameters(false));


Console.WriteLine(publicRsa.ToXmlString(false));
Console.WriteLine(publicPrivateRsa.ToXmlString(false));

//Dispose those two CSPs.
using (publicRsa)
{
    publicRsa.Clear();
}
using (publicPrivateRsa)
{
    publicRsa.Clear();
}

publicPrivateRsa = new RSACryptoServiceProvider(new CspParameters()
{
    KeyContainerName = "PublicPrivateKey",
    Flags = CspProviderFlags.UseMachineKeyStore
    //Flags = CspProviderFlags.UseDefaultKeyContainer
}
    );


publicRsa = new RSACryptoServiceProvider(new CspParameters()
{
    KeyContainerName = "PublicKey",
    Flags = CspProviderFlags.UseMachineKeyStore
    //Flags = CspProviderFlags.UseDefaultKeyContainer
}
    );

Console.WriteLine(publicRsa.ToXmlString(false));
Console.WriteLine(publicPrivateRsa.ToXmlString(false));


using (publicRsa)
{
    publicRsa.Clear();
}
using (publicPrivateRsa)
{
    publicRsa.Clear();
}
9
задан Andrew Kimball 10 April 2010 в 11:26
поделиться

1 ответ

Играть perlgolf?

-ple y/0-9A-Fa-f//cd;$_=pack"H*",$_
-ple $_=pack"H*",$_,join"",split
-nE say map chr hex,split
-naE say map chr hex,@F
-121--4577873-

Вы можете сделать одно из следующих...

ListView.SeliceMode = SeliceMode.Extended в кодовом коде или

< ListView SeliceMode = «Extended» > в XAML

также имеется «несколько» режимов выбора, однако можно перейти к «расширенному», что позволяет пользователю выбирать только несколько предметы

Для удаления выбранных предметов можно использовать свойство ListView.SelectedItems следующим образом

while( myListView.SelectedItems.Count > 0 )
{
    myListView.Items.Remove(list.SelectedItems[0]);
}

[или можно использовать свойство SelectedIndices]

Надеюсь, это позволит избежать проблемы, с которой вы столкнулись:)

Ура!

-121--2758797-

Представляется, что контейнеры ключей не предназначены для этой цели (это подразумевается в документе «How to: Store Asymmetric Keys in a Key Container» из Руководства разработчика .NET Framework, и подтверждается дискузией по MSDN ).

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

5
ответ дан 3 November 2019 в 07:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: