`
fastwind
  • 浏览: 324387 次
  • 性别: Icon_minigender_1
  • 来自: 天津
社区版块
存档分类
最新评论

对MemoryStream进行压缩、加密

 
阅读更多

在应用DeflateStream 或GZipStream进行压缩的时候,一定要先调用其实例的Close()方法,否则基流中的被压
缩的数据是不完整的,无法进行解压缩操作。这一点很重要!
       对内存流进行加密后应用基流这前一定要调用 CryptoStream 的 FlushFinalBlock 方法,否则无法解密!

    public class Serialize
    {
        // 用于初始化对称密钥
        private static byte[] key = { 1234567890123456,
            
7890123456789012
        };
        
private static byte[] IV = { 1234567890123456 };


        
/// <summary>
        
/// 将对象压缩加密到字节数据
        
/// </summary>
        
/// <param name="obj">要压缩加密的对象</param>
        
/// <returns>处理后生成的字节数组</returns>
        public static byte[] CompressEncryptToBytes(object obj)
        {
            
// 建立对称密码信息
            MemoryStream ms = new MemoryStream();
            RijndaelManaged RM 
= new RijndaelManaged();
            CryptoStream EnCrpStrm 
= new CryptoStream(ms, RM.CreateEncryptor(key,IV), CryptoStreamMode.Write);
            DeflateStream zip 
= new DeflateStream(EnCrpStrm, CompressionMode.Compress, true);
            
try
            {
                BinaryFormatter serializer 
= new BinaryFormatter();
                serializer.Serialize(zip, obj);
                zip.Close();        
// 在返回(return)这前一定要进行关闭
                EnCrpStrm.FlushFinalBlock();    // 在返回(return)这前一定要进行调用。
                return ms.ToArray();
            }
            
catch (Exception e)
            {
                MsgBoxs.Alert(e.ToString());
                
return null;
            }
            
finally
            {
                EnCrpStrm.Close();
                ms.Close();
            }
        }

        
/// <summary>
        
/// 将字节数组进行解密解压还原成对象
        
/// </summary>
        
/// <param name="ary">要处理的字节数组</param>
        
/// <returns>被还原的对象</returns>
        public static object DecompressDecryptToObject(byte[] ary)
        {
            MemoryStream ms 
= new MemoryStream(ary);
            RijndaelManaged RM 
= new RijndaelManaged();
            CryptoStream DeCrpStrm 
= new CryptoStream(ms, RM.CreateDecryptor(key, IV), CryptoStreamMode.Read);
            DeflateStream UnZip 
= new DeflateStream(DeCrpStrm, CompressionMode.Decompress);
            
try
            {
                BinaryFormatter serializer 
= new BinaryFormatter();
                
return serializer.Deserialize(UnZip);
            }
            
catch (Exception e)
            {
                MsgBoxs.Alert(e.ToString());
                
return null;
            }
            
finally
            {
                UnZip.Close();
                DeCrpStrm.Close();
                ms.Close();
            }
        }

        
/// <summary>
        
/// 将对象压缩到字节数组
        
/// </summary>
        
/// <param name="obj">要压缩的对象</param>
        
/// <returns>压缩后的字节数组</returns>
        public static byte[] CompressedToBytes(object obj)
        {
            MemoryStream ms 
= new MemoryStream();
            DeflateStream zip 
= new DeflateStream(ms, CompressionMode.Compress, true);
            
try
            {
                BinaryFormatter serializer 
= new BinaryFormatter();
                serializer.Serialize(zip, obj);
                zip.Close();
                
byte[] ary = ms.ToArray();
                ms.Close();
                
return ary;
            }
            
catch (Exception e)
            {
                zip.Close();
                ms.Close();
                MsgBoxs.Alert(e.ToString());
                
return null;
            }
        }

        /// <summary>
        /// 解压缩后对象
        /// </summary>
        /// <param name="ary">字节数组</param>
        /// <returns>对象</returns>
        public static object DecompressToObject(byte[] ary)
        {
            MemoryStream ms 
= new MemoryStream(ary);
            DeflateStream UnZip 
= new DeflateStream(ms, CompressionMode.Decompress);
            
try
            {
                BinaryFormatter serializer 
= new BinaryFormatter();
                
object obj = serializer.Deserialize(UnZip);
                UnZip.Close();
                ms.Close();
                
return obj;
            }
            
catch (Exception e)
            {
                UnZip.Close();
                ms.Close();
                MsgBoxs.Alert(e.ToString());
                
return null;
            }
        }
    }
分享到:
评论

相关推荐

    文件、文件夹压缩、加密

    如果文件在压缩时已被加密,那么在解压前需要先进行解密操作。 对于包含DLL(动态链接库)的文件夹,压缩过程不会有任何特殊处理,因为DLL本质上也是二进制文件,只需按照普通文件的方式处理即可。不过,在解压后,...

    21种加密54种压缩算法模块

    在VB中实现加密和解密过程,通常需要创建对应的加密对象,设置密钥,然后对数据进行操作。例如,使用AES加密: ```vb Dim rijndael As New RijndaelManaged() rijndael.Key = Encoding.ASCII.GetBytes("YourKey") ...

    memorystream

    2. **压缩与解压缩**:可以将`GZipStream`或`DeflateStream`封装在`MemoryStream`中,实现数据的压缩和解压缩。 3. **图像处理**:处理图像数据时,可以先将图像转换为字节数组,然后使用`MemoryStream`进行操作,如...

    C# 利用 ICSharpCode.SharpZipLib.dll 对单个文件进行压缩

    在.NET开发环境中,如果你需要对单个文件进行压缩操作,可以借助第三方库ICSharpCode.SharpZipLib。...此外,ICSharpCode.SharpZipLib库还提供了对解压缩、加密等更多高级功能的支持,可以根据需要进行探索和使用。

    C# 环境下如何实现AES数据加密.zip

    本教程将详细阐述如何在C#中使用AES进行数据加密。 首先,我们需要引入必要的命名空间,这可以通过在代码顶部添加以下代码来完成: ```csharp using System; using System.IO; using System.Security.Cryptography;...

    基于C#的数据加密、解密示例

    6. **文件和流的加密**:C#还提供了一些用于加密文件和流的类,如CryptoStream,可以直接对文件进行加密和解密操作。 在提供的文件列表中,我们看到有".rar"文件,这通常是一个压缩文件,可能包含了加密的示例代码...

    MD5加密解密

    3. **迭代压缩**:对每个数据块进行多次压缩操作,每次压缩都将消息的一部分转换成一个128位的摘要。 4. **输出摘要**:所有数据块处理完成后,得到最终的128位MD5摘要。 ### MD5加密特性 - **确定性**:相同的输入...

    C#口令加密RAR完整源码.rar

    这个项目可能包括了使用AES或其他加密算法对口令进行哈希或加密的类,以及使用SharpCompress库创建和管理加密RAR文件的函数。通过学习和理解这些源码,开发者可以增强他们的数据安全实践,更好地理解和应用C#中的...

    文件资源管理器/加密资源库/DoSeenPic/防复制

    解压文件后 Lib.dll 图库数据文件 基础加密/16进制存储/加密编码 ... //System.IO.MemoryStream ms = new System.IO.MemoryStream(Link.DataLink.EnCode(by)); //Image img=Image.FromStream(ms);

    C# 压缩及解压缩ZIP文件

    本教程将专注于使用ICSharpCode.SharpZipLib库进行这一操作,这是一个功能强大的开源库,允许开发者执行各种压缩任务,包括创建、读取和修改ZIP文件。 ### 1. 引入库 首先,要在C#项目中使用ICSharpCode....

    使用ICSharpCode.SharpZipLib压缩和解压文件

    三、对目标文件解压解压缩文件的过程相对简单,可以通过ZipInputStream来实现。首先创建一个FileStream用于读取zip文件,然后用ZipInputStream包裹这个FileStream。接下来,遍历ZipInputStream中的每个ZipEntry,为...

    .NET MD5加密解密代码解析

    首先,MD5(Message-Digest Algorithm 5)是广泛使用的一种加密散列函数,它能够将任意长度的数据(信息)压缩成固定长度(128位,即32个字符)的信息摘要。MD5由Ronald L. Rivest于1992年设计,主要用于确保信息...

    ICSharpCode.SharpZipLib.dll

    6. **安全性**: 虽然ICSharpCode.SharpZipLib本身并不直接支持加密,但开发者可以通过其他方式(如使用第三方库)在压缩前对数据进行加密,然后使用该库进行压缩。 7. **性能优化**: 由于SharpZipLib是用C#编写的,...

    Ionic.Zip.rar

    在.NET开发环境中,有时我们需要对文件进行压缩和解压缩操作,这时可以借助第三方库来实现。本文将深入探讨如何使用`Ionic.Zip`库在C#项目中进行文件的压缩与解压缩,以及如何将该库引入到项目中。 `Ionic.Zip`是一...

    [C#]image与byte数组的转换

    - **加密解密**:对于安全性有较高要求的应用程序,可能还需要对图像进行加密处理,此时也需要将图像转换为字节数组。 ### 二、将图像转换为字节数组 #### 方法一:使用`MemoryStream` 使用`MemoryStream`是一种...

    c#打包文件解压缩的实例

    在C#编程中,解压缩文件是一项常见的任务,特别...此外,`Ionic.Zip`库还提供了许多其他功能,例如加密压缩、设置压缩级别、添加文件到压缩包等。开发者可以根据具体需求灵活运用这些功能来实现更复杂的文件处理任务。

    asp.net 使用Stream读写存储的图像源码

    它不关心数据的实际来源或去向,可以是磁盘文件、网络连接、内存缓冲区甚至是加密或压缩的数据。通过Stream,我们可以处理各种不同的数据源,包括图像文件。 在ASP.NET中,当处理图像时,我们通常会用到System.IO...

    浅谈.Net中的序列化和反序列化

    在`Main`方法中,创建`Person`实例并对其进行序列化,存储到内存的`MemoryStream`中。然后,我们将`MemoryStream`的位置重置,并从流中反序列化对象。之后,可以通过对象的方法和属性使用反序列化后的对象。 除了...

    Net音频库[含[1].net语音聊天代码]软件包

    例如,可以使用SSL/TLS协议对网络通信进行加密,确保数据传输的安全性。 综上所述,"Net音频库[含[1].net语音聊天代码]软件包"是一个涵盖音频处理、网络通信、多线程编程等多个技术领域的学习资源,对于希望深入...

Global site tag (gtag.js) - Google Analytics