RSACryptoServiceProvider KeyContainer, кажется, истекло время ожидания? - PullRequest
1 голос
/ 31 августа 2010

Я использую RSACryptoServiceProvider, как это ...

 private byte[] RSAEncrypt(byte[] DataToEncrypt, string ContainerName, bool DoOAEPPadding)
    {
        try
        {
            byte[] encryptedData;

            // Create a new instance of CspParameters.  Pass
            // 13 to specify a DSA container or 1 to specify
            // an RSA container.  The default is 1.
            CspParameters cspParams = new CspParameters();

            // Specify the container name using the passed variable.
            cspParams.KeyContainerName = ContainerName;

            cspParams.Flags = CspProviderFlags.UseDefaultKeyContainer;

            //Create a new instance of RSACryptoServiceProvider.
            using (RSACryptoServiceProvider RSA = new RSACryptoServiceProvider(cspParams))
            {
                //Encrypt the passed byte array and specify OAEP padding.  
                //OAEP padding is only available on Microsoft Windows XP or
                //later.  

                encryptedData = RSA.Encrypt(DataToEncrypt, DoOAEPPadding);
            }
            return encryptedData;
        }
        //Catch and display a CryptographicException  
        //to the console.
        catch (CryptographicException ex)
        {
            sl.Write(ex, MessageType.Error);
            throw;                
        }
    }

Затем я пытаюсь расшифровать данные после выключения моего приложения Windows Form для подключаемого модуля Outlook и его повторного включения, что и используется в этой части кода. Код расшифровки выглядит следующим образом ...

private byte[] RSAEncrypt(byte[] DataToEncrypt, string ContainerName, bool DoOAEPPadding)
    {
        try
        {
            byte[] encryptedData;

            // Create a new instance of CspParameters.  Pass
            // 13 to specify a DSA container or 1 to specify
            // an RSA container.  The default is 1.
            CspParameters cspParams = new CspParameters();

            // Specify the container name using the passed variable.
            cspParams.KeyContainerName = ContainerName;

            cspParams.Flags = CspProviderFlags.UseDefaultKeyContainer;

            //Create a new instance of RSACryptoServiceProvider.
            using (RSACryptoServiceProvider RSA = new RSACryptoServiceProvider(cspParams))
            {
                //Encrypt the passed byte array and specify OAEP padding.  
                //OAEP padding is only available on Microsoft Windows XP or
                //later.  

                encryptedData = RSA.Encrypt(DataToEncrypt, DoOAEPPadding);
            }
            return encryptedData;
        }
        //Catch and display a CryptographicException  
        //to the console.
        catch (CryptographicException ex)
        {
            sl.Write(ex, MessageType.Error);
            throw;                
        }
    }    

Прекрасно работает, пока не появится что-то, на что я не могу положить палец. Я не знаю, похоже ли это на изменение даты или как. Происходит следующее: я пытаюсь расшифровать данные и получаю ошибку «неверные данные». Теперь снова это работает отлично, пока не истечет какой-то промежуток времени, или отключение приложения или выход пользователя из системы. Я просто не знаю и не могу определить, что вызывает это. В тот момент, когда я удаляю зашифрованные данные из текстового файла, воссоздаю и дешифрую, у меня нет проблем. Даже если я перезапущу приложение между шифрованием / сохранением в файл и чтением из файла / расшифровкой, оно будет прекрасно работать! Что-то происходит, и я просто недостаточно хорошо знаю KeyContainers, чтобы понять, что может привести к истечению срока действия CspParameters - это мое лучшее предположение?

Ответы [ 3 ]

0 голосов
/ 09 сентября 2010

Я использовал флаг CspParameters и вместо хранилища KeyContainer пользователей я использовал хранилище KeyContainer для машины.

0 голосов
/ 17 января 2013

Да, если вы установите: cspParams.Flags = CspProviderFlags.UseDefaultKeyContainer;

, тогда контейнер ключей будет сохранен в хранилище контейнеров ключей пользователя, затем войдите в систему как другой пользователь и с помощью RSA представит вамсовершенно другое хранилище KeyContainer.

Использование этого вместо этого: cspParams.Flags = CspProviderFlags.UseMachineKeyStore = true;

Будет использовать хранилище KeyContainer локального компьютера, которое является глобальным для машины, и предоставитвы с тем же хранилищем KeyContainer, независимо от того, какой пользователь вошел в систему. Однако это относится только к этой установке Windows.Запуск вашей программы под другой установкой Windows или машиной предоставит вам другое хранилище KeyContainer.Если вы хотите расшифровать одни и те же данные на нескольких компьютерах, вам необходимо сохранить свой ключ в файле на жестком диске.Сохранение ключа в простом текстовом файле представляет огромную угрозу безопасности, поэтому, пожалуйста, зашифруйте свой ключ перед сохранением его в файл или поместите в защищенные паролем файлы .rar или что-то в этом роде.

Если у вас все еще есть проблемы, попробуйте установить: RSA.PersistKeyInCsp = true;

Это обеспечит сохранение вашего ключа в хранилище KeyContainer.Сохранение файла в KeyContainer должно быть поведением по умолчанию, если вы используете конструктор CspParameters, такой как:

CspParameters cspParams = new CspParameters ();

Другими словами Microsoft: «Эта форма CspParametersинициализирует поле ProviderType значением 24, которое указывает провайдера PROV_RSA_AES. "Источник: http://msdn.microsoft.com/en-us/library/xw9ywed4.aspx

Так что ваши комментарии в вашем коде неверны, и я могу вводить вас в заблуждение.Я бы посоветовал вам исправить их.

Я не уверен в других типах ProviderTypes и их настройках по умолчанию, касающихся сохранения ключа в хранилище KeyContainer, поэтому может потребоваться установить значение TRUE для PersistKeyInCsp в значение TRUE.

Надеюсь, это поможет.

~ Adam WhiteHat ();

0 голосов
/ 31 августа 2010

Вы можете попробовать использовать криптографические библиотеки надувных замков, если вы действительно застряли:

http://www.bouncycastle.org/csharp/

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