1

CryptoStream Decryptor に問題があります。別のスレッドでファイルを復号化しています。だからここに問題があります:

ファイルを最後まで復号化すると、すべて問題ありませんが、グローバル変数を使用してスレッドを停止し、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();            
        }
4

0 に答える 0