Ошибка постоянства при генерации ключа RSA с использованием RSACryptoServiceProvider - PullRequest
0 голосов
/ 31 января 2020

У меня возникла проблема со странной ошибкой при многократном вызове 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 происходит как в отладка и выпуск.

...