Как сохранить открытый ключ в контейнере RSA-ключа машинного уровня - PullRequest
9 голосов
/ 16 февраля 2010

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

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

Код работает, когда для CspParameters.Flags указано CspProviderFlags.UseDefaultKeyContainer (т. Е. Ключ, считанный обратно из контейнера PublicKey , тот же), но когда для CspParameters.Flags указано CspProviderFlags.UseMachineKeyStore ключ, считанный с 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();
}

Ответы [ 2 ]

5 голосов
/ 18 февраля 2010

Похоже, что контейнеры ключей не предназначены для этой цели (это подразумевается в разделе «Как: хранить асимметричные ключи в контейнере ключей» из Руководства разработчика .NET Framework и подтверждается исключением в MSDN ).

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

0 голосов
/ 02 мая 2013

Эта ссылка может вам помочь. http://msdn.microsoft.com/en-IN/library/tswxhw92(v=vs.80).aspx

var cp = new CspParameters();
cp.KeyContainerName = ContainerName;

// Create a new instance of RSACryptoServiceProvider that accesses
// the key container.
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(cp);

// Delete the key entry in the container.
rsa.PersistKeyInCsp = false;

// Call Clear to release resources and delete the key from the container.
rsa.Clear();

Это то, что говорится об удалении ключа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...