一个使用DES进行文件加密解密的类,之前解决了“要解密的数据长度无效”的错误,现在又出现了另一个错误:对图片文件进行加密解密操作成功,但对文本文件进行加密,再解密出来时候,却发现会在原来文本结尾多了些乱码,百思不得其解,望高手赐教。
class DESCrypt
{
private byte[] Key = new byte[8]{1,8,2,7,3,6,4,5};
public void Encrypt(string FileName)
{
DESCryptoServiceProvider des = new DESCryptoServiceProvider();
des.Key = Key;
des.IV = Key;
FileStream InputFileStream = File.OpenRead(FileName);
byte[] FileStreamArray = new byte[InputFileStream.Length];
InputFileStream.Read(FileStreamArray, 0, FileStreamArray.Length);
InputFileStream.Close();
MemoryStream ms = new MemoryStream();
CryptoStream FileCryptoStream = new CryptoStream(ms,des.CreateEncryptor(), CryptoStreamMode.Write);
FileCryptoStream.Write(FileStreamArray, 0, FileStreamArray.Length);
FileCryptoStream.FlushFinalBlock();
InputFileStream = File.OpenWrite(FileName);
foreach (byte b in ms.ToArray())
{
InputFileStream.WriteByte(b);
}
FileCryptoStream.Close();
InputFileStream.Close();
ms.Close();
}
public void Decrypt(string FileName)
{
DESCryptoServiceProvider des = new DESCryptoServiceProvider();
des.Key = Key;
des.IV = Key;
FileStream InputFileStream = File.OpenRead(FileName);
byte[] FileStreamArray = new byte[InputFileStream.Length];
InputFileStream.Read(FileStreamArray, 0, FileStreamArray.Length);
InputFileStream.Close();
MemoryStream ms = new MemoryStream();
CryptoStream FileCryptoStream = new CryptoStream(ms, des.CreateDecryptor(), CryptoStreamMode.Write);
FileCryptoStream.Write(FileStreamArray, 0, FileStreamArray.Length);
FileCryptoStream.FlushFinalBlock();
InputFileStream = File.OpenWrite(FileName);
foreach (byte b in ms.ToArray())
{
InputFileStream.WriteByte(b);
}
FileCryptoStream.Close();
InputFileStream.Close();
ms.Close();
}
}
class DESCrypt
{
private byte[] Key = new byte[8]{1,8,2,7,3,6,4,5};
public void Encrypt(string FileName)
{
DESCryptoServiceProvider des = new DESCryptoServiceProvider();
des.Key = Key;
des.IV = Key;
FileStream InputFileStream = File.OpenRead(FileName);
byte[] FileStreamArray = new byte[InputFileStream.Length];
InputFileStream.Read(FileStreamArray, 0, FileStreamArray.Length);
InputFileStream.Close();
MemoryStream ms = new MemoryStream();
CryptoStream FileCryptoStream = new CryptoStream(ms,des.CreateEncryptor(), CryptoStreamMode.Write);
FileCryptoStream.Write(FileStreamArray, 0, FileStreamArray.Length);
FileCryptoStream.FlushFinalBlock();
InputFileStream = File.OpenWrite(FileName);
foreach (byte b in ms.ToArray())
{
InputFileStream.WriteByte(b);
}
FileCryptoStream.Close();
InputFileStream.Close();
ms.Close();
}
public void Decrypt(string FileName)
{
DESCryptoServiceProvider des = new DESCryptoServiceProvider();
des.Key = Key;
des.IV = Key;
FileStream InputFileStream = File.OpenRead(FileName);
byte[] FileStreamArray = new byte[InputFileStream.Length];
InputFileStream.Read(FileStreamArray, 0, FileStreamArray.Length);
InputFileStream.Close();
MemoryStream ms = new MemoryStream();
CryptoStream FileCryptoStream = new CryptoStream(ms, des.CreateDecryptor(), CryptoStreamMode.Write);
FileCryptoStream.Write(FileStreamArray, 0, FileStreamArray.Length);
FileCryptoStream.FlushFinalBlock();
InputFileStream = File.OpenWrite(FileName);
foreach (byte b in ms.ToArray())
{
InputFileStream.WriteByte(b);
}
FileCryptoStream.Close();
InputFileStream.Close();
ms.Close();
}
}
解决方案 »
- (急!急!急!)sendArray.BeginSend() error, Error=由于套接字没有连接并且(当使用一个 sendto 调用发送数据报套接字时)
- 分享一个配置文件管理工具,附源代码免积分下载,相信他能够减轻一点大家的工作
- 在窗体A的函数代码中,如何引用窗体B的当前实例
- 对以前月份文件的导出
- 数组?
- (新)如何在字符串中添加双引号 "
- 有关“内置引用类型”string和object的疑问
- 当点击程序子窗体中页面的一个链接并开启一个新窗口时总是调用了默认的IE浏览器来打开...
- SqlCommand如何执行多行sql脚本? 还没搞定,高手帮忙,急啊!
- C# 调用,ABAP with a Parameter, but Get Nothing with No Error ?
- 关于DockPanel V2.2版权的问题
- webBrowser的问题 在webBrowser 中的内容改变时怎样它弹出的对话框
只会覆盖对应字解位置的内容你应该用BinaryWriter这类的东西来帮你输出
就是这种情况,譬如现在那个未加密的文件的内容是123文件长度是3个字节加密后,文件长度是8个字节而当你解密后,明文本来是正确的,但是
InputFileStream = File.OpenWrite(FileName); 是在一个不覆盖文件,而是覆盖内容的方法(当然,可能内部会有些开关可以控制,我就没有看了)
所以你在那里WriteByte的话,就等于覆盖了内容,所以头3个字节是对的,但这个时候,应该是已经结束。
但由于原来加密后的文件就有8个字节,所以它会继续保持着8个字节。(当然后5个字节的内容也是保持着)所以干脆就是以覆盖文件的方式,而不是覆盖内容的方式
使用BinaryWriter或者StreamWriter来写入是最安全的办法