当前位置:编程学习 > C#/ASP.NET >>

文件加密后解密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#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,