У меня возникла проблема со странной ошибкой при многократном вызове RSACryptoServiceProvider
для создания пары ключей private / publi c:
class Program
{
static void Main(string[] args)
{
try
{
CreateKey();
}
catch (Exception e)
{
Console.WriteLine("First failure:"+ e);
}
try
{
CreateKey();
}
catch (Exception e)
{
Console.WriteLine("Second failure:" + e);
}
}
private static void CreateKey()
{
var cp = new CspParameters
{
KeyContainerName = "ContainerKey.1"
};
using (var rsa = new RSACryptoServiceProvider(cp) { PersistKeyInCsp = false })
{
Console.WriteLine(rsa.ToXmlString(true));
Console.WriteLine(rsa.ToXmlString(false));
rsa.Clear();
}
}
}
Результат выполнения вышеуказанного кода (опускает мой):
<RSAKeyValue>[Private key content omitted]</RSAKeyValue>
<RSAKeyValue>[Public key content omitted]</RSAKeyValue>
Second failure:System.Security.Cryptography.CryptographicException: Keyset as registered is invalid.
at System.Security.Cryptography.Utils.CreateProvHandle(CspParameters parameters, Boolean randomKeyContainer)
at System.Security.Cryptography.Utils.GetKeyPairHelper(CspAlgorithmType keyType, CspParameters parameters, Boolean randomKeyContainer, Int32 dwKeySize, SafeProvHandle& safeProvHandle, SafeKeyHandle& safeKeyHandle)
at System.Security.Cryptography.RSACryptoServiceProvider.GetKeyPair()
at System.Security.Cryptography.RSACryptoServiceProvider..ctor(Int32 dwKeySize, CspParameters parameters, Boolean useDefaultKeySize)
at System.Security.Cryptography.RSACryptoServiceProvider..ctor(CspParameters parameters)
at RsaTest.Program.CreateKey() in C:\Users\RF185104\source\repos\RsaTest\RsaTest\Program.cs:line 39
at RsaTest.Program.Main(String[] args) in C:\Users\RF185104\source\repos\RsaTest\RsaTest\Program.cs:line 25
При выполнении приведенного выше кода первый вызов CreateKey
работает правильно, но второй вызов завершается неудачно. При повторном запуске кода теперь даже первый сбой означает, что где-то что-то сохранилось. Но этого не должно происходить, так как установка PersistKeyInCsp
в false должна предотвратить сохранение ключей. Изменение KeyContainerName
заставляет звонок работать снова, но только один раз. Следующий вызов затем также завершается неудачей.
Я полагаю, что у меня есть большое недопонимание того, как работает RSACryptoServiceProvider
, так как я понятия не имею, как может появиться вышеуказанная ошибка.
Основная цель этого код заключается в создании пары ключей RSA без сохранения ее в локальном хранилище, поэтому другие приложения, работающие на одном и том же пользователе, не могут получить к ней доступ.
Запуск Windows 10, NET Framework 4.7.2 происходит как в отладка и выпуск.