CryptoStream实例关闭时引发异常



我有一个使用RijndaelManaged密码的DecryptString函数。它在99.999%的时间内都能工作,但当它试图关闭finally块中的cryptoStream时,偶尔会抛出"IndexOutOfRangeException"异常,并显示消息"Index was outside of the bound of the array."。

当它停止工作时,它将停止工作20分钟左右,然后启动在没有明显解释的情况下再次工作。我有一个线索是它只是

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();
            }
        }

我注意到的一件事是,在finally块中关闭cryptoStream之前,您正在关闭cryptocStream的底层流-也许您应该颠倒这两条语句?

相关内容

  • 没有找到相关文章

最新更新