C# C语言中的序列化、压缩和加密#

C# C语言中的序列化、压缩和加密#,c#,encryption,serialization,stream,compression,C#,Encryption,Serialization,Stream,Compression,我想编写一个C#类,它可以按顺序序列化、压缩和加密对象。我需要生成的文件 尽可能快地创建 占用尽可能少的空间 尽可能不可读 我已经研究和编码了一段时间,这就是我所拥有的 private void SaveObject(string path, object obj) { using (FileStream fileStream = new FileStream(path, FileMode.Create, FileAccess.Write, FileShare

我想编写一个C#类,它可以按顺序序列化、压缩和加密对象。我需要生成的文件

  • 尽可能快地创建
  • 占用尽可能少的空间
  • 尽可能不可读
我已经研究和编码了一段时间,这就是我所拥有的

    private void SaveObject(string path, object obj)
    {
        using (FileStream fileStream = new FileStream(path, FileMode.Create, FileAccess.Write, FileShare.None))
        {
            string password = "123";
            UnicodeEncoding UE = new UnicodeEncoding();
            byte[] key = UE.GetBytes(password);
            RijndaelManaged RMCrypto = new RijndaelManaged();
            using (CryptoStream cryptoStream = new CryptoStream(fileStream, RMCrypto.CreateEncryptor(key, key), CryptoStreamMode.Write))
            using (var gZipStream = new GZipStream(cryptoStream, CompressionMode.Compress))
            {
                BinaryFormatter binaryFormatter = new BinaryFormatter();
                binaryFormatter.Serialize(gZipStream, obj);
            }
        }
    }

    private void LoadObject(string path, out object obj)
    {
        using (FileStream fileStream = new FileStream(path, FileMode.Open))
        {
            string password = "123"; 
            UnicodeEncoding UE = new UnicodeEncoding();
            byte[] key = UE.GetBytes(password);
            RijndaelManaged RMCrypto = new RijndaelManaged();
            using (CryptoStream cryptoStream = new CryptoStream(fileStream, RMCrypto.CreateDecryptor(key, key), CryptoStreamMode.Read))
            using (var gZipStream = new GZipStream(cryptoStream, CompressionMode.Decompress))
            {
                BinaryFormatter binaryFormatter = new BinaryFormatter();
                obj = binaryFormatter.Deserialize(gZipStream);
            }
        }

    }
我是一名业余程序员,对序列化、流和加密知之甚少。我甚至感到惊讶的是,这项工作毫无问题。我的问题是:这段代码是否遵循了最佳编程实践,并在不浪费时间或资源的情况下充分实现了目标

注意:这是一种通用方法,我将在程序中使用它在本地存储数据。

请看一看。的InfoBlockConverter代码可以用作示例


以后只需添加压缩。这应该没那么难。

在代码中嵌入密码时不可读?如果您不想花时间阅读/理解通过加密解决的安全问题,您将从压缩中获得可比的结果。正如我在问题中所说的,我将仅将其用于存储本地文件。因此,我不知道应该使用哪种加密。还有,我不需要把密码存储在某个地方吗?你使用什么样的加密方式根本不重要。因为您不知道(或者至少在文章中没有明确指定)您试图解决的加密问题是什么,所以选择一个加密不会使您的代码/数据更加安全。也就是说,你能阅读Word的docx文件并理解其内容吗(请注意,它是公开记录的文件格式,没有任何加密)?我明白了。那么假设我试图阻止其他人理解或修改该文件。加密是否可能?如果不可能,在多大程度上会有帮助?@TerryAnderson-“我不需要将密码存储在某个地方吗?”-如果在加密/解密文件时提供密码,则不会。编译后的库可以反编译,因此在源代码中输入密码基本上比不加密文件多了一个角落。请在答案中解释您的代码的作用(或者更确切地说,它解决问题的原因)。因此,答案需要是自包含的。好吧,我共享的代码回答了“我想写一个C#类,它可以按顺序序列化、压缩和加密对象”的请求。我需要生成的文件-尽快创建-占用尽可能少的空间-尽可能不可读“我做了一些测试并压缩(使用GZipStream)加密字符串(使用我的AES算法)使其更长,因此这没有任何意义。我选择了AES(RIjndael encryption是其中的一个子集),因为这允许我在.net和较新的UAP(WinRT)应用程序之间共享代码。