C# 如果停止CryptoStream读取,则会出现坏数据异常

C# 如果停止CryptoStream读取,则会出现坏数据异常,c#,dispose,cryptostream,C#,Dispose,Cryptostream,我的加密流解密程序有问题。 我正在另一个线程上解密文件。 问题是: 当我让文件解密到最后,一切都正常,但当我停止线程,使用全局变量,退出while循环时 while( !stopThread && ( nBRead = csFile.Read(readbuf, 0, 8192)) != 0) 我在cryptostream Dispose中遇到坏数据异常 我做错了什么 这是我的密码: string ext; //textBox1.

我的加密流解密程序有问题。 我正在另一个线程上解密文件。 问题是:

当我让文件解密到最后,一切都正常,但当我停止线程,使用全局变量,退出while循环时

while( !stopThread && ( nBRead = csFile.Read(readbuf, 0, 8192)) != 0)
我在cryptostream Dispose中遇到坏数据异常

我做错了什么

这是我的密码:

            string ext; 
            //textBox1.Text = "";

            OpenFileDialog ofdFile = new OpenFileDialog();
            if (textMode)
                ofdFile.Title = "Please select text to decrypt.";
            else
                ofdFile.Title = "Please select file to decrypt.";

            OpenFileDialog ofdKey = new OpenFileDialog();
            ofdKey.Title = "Please select KEY.";


            // mora ovo ili invoke koga nema dialog :)
            originalContex.Send(delegate
            {
                dialogRes    = ofdFile.ShowDialog();
                dialogResKey = ofdKey.ShowDialog();
            }, null);


            if ( dialogRes == DialogResult.OK && dialogResKey == DialogResult.OK )
            {
                FileStream fsKey = new FileStream(ofdKey.FileName, FileMode.Open);
                byte[] iv = new byte[8];
                byte[] key = new byte[24];
                byte[] extB = new byte[20]; 
                fsKey.Read(iv, 0, 8);
                fsKey.Read(key, 0, 24);
                fsKey.Read(extB, 0, 20); 
                fsKey.Dispose();

                FileStream fsOpenedFile = new FileStream(ofdFile.FileName, FileMode.Open, FileAccess.Read);
                CryptoStream csFile = new CryptoStream(fsOpenedFile, new TripleDESCryptoServiceProvider().CreateDecryptor(key, iv), CryptoStreamMode.Read);


                if (textMode)
                {
                    int readbuf;
                    List<byte> lb = new List<byte>();

                    while ((readbuf = csFile.ReadByte()) != -1)
                        lb.Add((byte)readbuf);

                    textBox1.Invoke( new MethodInvoker(() => { textBox1.Text = Encoding.UTF8.GetString(lb.ToArray()); }) );

                    prog.Invoke(new MethodInvoker(() => { prog.Value = 100; }));
                }                   
                else // filemode
                {
                    byte[] readbuf = new byte[8192];
                    ext = Encoding.UTF8.GetString(extB).Trim('\0'); 


                    string saveDir = Path.GetDirectoryName(ofdFile.FileName) + "\\" + Path.GetFileNameWithoutExtension(ofdFile.FileName) + "_DECRYPTED";
                    Directory.CreateDirectory( saveDir );
                    Directory.SetCurrentDirectory( saveDir );



                    FileStream fsDecrFile = new FileStream(Path.GetFileNameWithoutExtension(ofdFile.FileName)  + ext, FileMode.Create, FileAccess.Write);

                    FileInfo fi = new FileInfo(ofdFile.FileName);
                    long oneProc = fi.Length / 100;
                    int nBRead = 0;
                    long nBReadacc = 0;

                    while (   !stopThread  &&  ( nBRead = csFile.Read(readbuf, 0, 8192)) != 0  )
                    {
                        nBReadacc += nBRead;
                        fsDecrFile.Write(readbuf, 0, nBRead);

                        if (nBReadacc >= oneProc)
                        {
                            nBReadacc = 0;
                            prog.Invoke(new MethodInvoker(() => { prog.Value +=1; }));
                        }
                    }

                    try
                    {
                        csFile.Dispose();
                    }
                    catch (CryptographicException e)
                    {                        
                        MessageBox.Show(e.Message);
                    }

                   // MessageBox.Show(nBReadacc.ToString());

                    fsDecrFile.Flush();
                    fsDecrFile.Dispose();   

                    prog.Invoke(new MethodInvoker(() => { prog.Value = 100; }));                   
                }



                fsOpenedFile.Dispose(); 
                // csFile.CopyTo



            }

            ofdFile.Dispose();
            ofdKey.Dispose();            
        }

你能提供完整的代码吗?我的猜测是,正试图刷新或读取已处理流的是编写器/读取器。我已编辑了我的问题并添加了代码。如果出现异常,这是否重要?只要你关闭文件,你就很好,对吗?下次阅读时,数据不会被破坏it@Patric:我明白了,但我很好奇为什么我会得到这个异常?很明显,因为这就是它的实现方式。如果dispose上的CryptoStream没有根据其算法进行正确的填充,则会引发异常。