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