Исключение выдается при закрытии экземпляра CryptoStream - PullRequest
0 голосов
/ 12 января 2012

У меня есть функция DecryptString, которая использует RijndaelManaged Cipher. Он работает в 99,999% случаев, но в некоторых случаях он генерирует исключение «IndexOutOfRangeException» с сообщением «Индекс находится за пределами массива». когда он пытается закрыть cryptoStream в блоке finally.

Когда он перестает работать, он перестает работать на 20 минут или около того, а затем запускается снова работает с неочевидным объяснением. Один из выводов, который у меня есть, состоит в том, что это только st

public string DecryptString(string InputText, string Password)
        {
            //checkParamSupplied("InputText", InputText);
            checkParamSupplied("Password", Password);

            MemoryStream memoryStream = null;
            CryptoStream cryptoStream = null;

            try
            {
                RijndaelManaged RijndaelCipher = new RijndaelManaged();

                byte[] EncryptedData = Convert.FromBase64String(InputText);

                byte[] Salt = Encoding.ASCII.GetBytes(Password.Length.ToString());

                PasswordDeriveBytes SecretKey = new PasswordDeriveBytes(Password, Salt);

                // Create a decryptor from the existing SecretKey bytes.
                ICryptoTransform Decryptor = RijndaelCipher.CreateDecryptor(SecretKey.GetBytes(32), SecretKey.GetBytes(16));

                memoryStream = new MemoryStream(EncryptedData);

                // Create a CryptoStream. (always use Read mode for decryption).
                cryptoStream = new CryptoStream(memoryStream, Decryptor, CryptoStreamMode.Read);

                // Since at this point we don't know what the size of decrypted data
                // will be, allocate the buffer long enough to hold EncryptedData;
                // DecryptedData is never longer than EncryptedData.
                byte[] PlainText = new byte[EncryptedData.Length];

                // Start decrypting.
                int DecryptedCount = cryptoStream.Read(PlainText, 0, PlainText.Length);

                // Convert decrypted data into a string. 
                string DecryptedData = Encoding.Unicode.GetString(PlainText, 0, DecryptedCount);

                // Return decrypted string.   
                return DecryptedData;
            }
            catch (Exception ex)
            {
                throw;
            }
            finally
            {
                //Close both streams.
                memoryStream.Close();
                cryptoStream.Close();
            }
        }

1 Ответ

1 голос
/ 12 января 2012

Одна вещь, которую я замечаю, заключается в том, что вы закрываете базовый поток cryptoStream до того, как закроете сам cryptoStream в своем блоке finally - возможно, вам следует обратить вспять эти два оператора?

...