文件加密后解密Response输出流出错问题
加密解密方法:
/// <summary>
/// 初始化对称密匙
/// </summary>
public string Key = "MD5JIAMIJIEMIAAAAAAAAAAAAAAAAAAA";
/// <summary>
/// 初始化向量
/// </summary>
public string IV = "ListJJJJJJJJJJJJ";
/// <summary>
/// 文件分块加密大小
/// </summary>
public int EncryCount = 1024;
/// <summary>
/// 加密函数
/// </summary>
/// <param name="OpenFileName">需要加密文件位置</param>
/// <param name="OutFileName">加密后保存位置</param>
public void Encryption(string OpenFileName, string OutFileName)
{
try
{
byte[] buffer = new byte[EncryCount];
AesManaged AES = new AesManaged();
AES.Key = UTF8Encoding.UTF8.GetBytes(Key);
AES.IV = UTF8Encoding.UTF8.GetBytes(IV);
ICryptoTransform Transform = AES.CreateEncryptor(AES.Key, AES.IV);
//写进文件
using (FileStream OutWrite = new FileStream(OutFileName, FileMode.Create))
{
using (CryptoStream CS = new CryptoStream(OutWrite, Transform, CryptoStreamMode.Write))
{
//打开文件
using (FileStream OpenFile = new FileStream(OpenFileName, FileMode.Open))
{
int Length;
while ((Length = OpenFile.Read(buffer, 0, EncryCount)) > 0)
CS.Write(buffer, 0, (int)Length);
}
}
}
}
catch (Exception ex)
{
throw new Exception("加密出错!");
}
}
/// <summary>
/// 解密函数
/// </summary>
/// <param name="OutFileName">解密文件保存位置</param>
/// <param name="OpenFileName">加密文件位置</param>
public void Decryption(string OutFileName, string OpenFileName)
{
try
{
byte[] buffer = new byte[EncryCount];
AesManaged AES = new AesManaged();
AES.Key = UTF8Encoding.UTF8.GetBytes(Key);
AES.IV = UTF8Encoding.UTF8.GetBytes(IV);
ICryptoTransform Transform = AES.CreateDecryptor(AES.Key, AES.IV);
//写进文件
using (FileStream OutWrite = new FileStream(OutFileName, FileMode.Create))
{
using (CryptoStream CS = new CryptoStream(OutWrite, Transform, CryptoStreamMode.Write))
{
//打开文件
using (FileStream OpenFile = new FileStream(OpenFileName, FileMode.Open))
{
int Length;
while ((Length = OpenFile.Read(buffer, 0, EncryCount)) > 0)
CS.Write(buffer, 0, (int)Length);
}
}
}
}
catch (Exception ex)
{
throw new Exception("解密出错!");
}
}
使用上面的方法加密解密不会出现问题,我想web上解密后使用Response.BinaryWrite()方法输出出现问题。
Web解密方法:
/// <summary>
/// Web解密后输出下载
/// </summary>
/// <param name="OpenFileName">加密文件路径</param>
public void Decryption(string OpenFileName)
{
try
{
byte[] buffer = new byte[1024];
AesManaged AES = new AesManaged();
AES.Key = UTF8Encoding.UTF8.GetBytes("MD5JIAMIJIEMIAAAAAAAAAAAAAAAAAAA");
AES.IV = UTF8Encoding.UTF8.GetBytes("ListJJJJJJJJJJJJ");
ICryptoTransform Transform = AES.CreateDecryptor(AES.Key, AES.IV);
using (MemoryStream str = new MemoryStream())
{
using (CryptoStream CS = new CryptoStream(str, Transform, CryptoStreamMode.Write))
{
//打开文件
using (FileStream OpenFile = new FileStream(OpenFileName, FileMode.Open))
{
int Length;
while ((Length = OpenFile.Read(buffer, 0, 1024)) > 0)
CS.Write(buffer, 0, (int)Length);
}
byte[] b = str.ToArray();
Context.Response.Clear();
Context.Response.Buffer = false;
Context.Response.AddHeader("Connection", "Keep-Alive");
if (Path.GetExtension(OpenFileName) == ".docx")
{
Context.Response.ContentType = "application/doc";
}
else
{
Context.Response.ContentType = "application/octet-stream";
}
// 如果文件名包含中文了,应该使用HttpUtility.UrlEncode(filename)
Response.AddHeader("Content-Disposition", "attachment;filename=" + HttpUtility.UrlEncode(Path.GetFileName(OpenFileName)));
Context.Response.AddHeader("Content-Length", str.Length.ToString());
Context.Response.BinaryWrite(b);
Context.Response.Close();
}
}
}
catch (Exception ex)
{
throw new Exception("解密出错!");
}
}
问题表现:
WEB下载下来的解密文件rar压缩文件office2007格式打开会报错。
求各位大牛看看是什么原因,有没有什么解决办法。 解密 CryptoStream Response
补充:.NET技术 , C#