У меня проблема с использованием контейнера ключей 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();
}