在C#中进行序列化、压缩和加密

3
我想编写一个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);
            }
        }

    }

我是一名业余程序员,对序列化、流和加密知识了解甚少。我甚至很惊讶这段代码能够正常运行。我的问题是:这段代码是否遵循最佳编程实践,能否在不浪费时间或资源的情况下达到足够的目标?

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


代码中内嵌密码导致不可读?如果您不想花时间阅读/理解加密解决的安全问题,那么仅使用压缩也可以获得相似的结果。 - Alexei Levenkov
正如我在问题中所说,我只会用它来存储本地文件。因此,我不知道应该使用什么类型的加密。另外,我难道不需要将密码存储在某个地方吗? - Terry Anderson
使用什么类型的加密完全没有关系。因为您不知道(或者至少在帖子中没有明确指定)您尝试使用加密解决什么问题,选择一个加密方式并不会使您的代码/数据更安全。例如,您能否阅读Word的docx文件并理解其内容(请注意,这是一种公开文档格式,没有任何加密)? - Alexei Levenkov
我明白了。那么假设我想要防止别人理解或修改文件,使用加密是否可以实现?如果无法实现,使用加密会有多大的帮助呢? - Terry Anderson
@TerryAnderson - “我不需要在某处存储密码吗?”- 如果在加密/解密文件时提供密码,那么就不需要。编译的库可以被反编译,因此在源代码中拥有密码基本上只是增加了一个小角落,与保留未加密的文件相比。 - Corak
1个回答

0

请在答案中解释您的代码是做什么的(或者更确切地说,为什么它可以解决问题)。SO上的答案需要自包含。 - Maarten Bodewes
我分享的代码回答了这样的请求:“我想编写一个C#类,可以按顺序对对象进行序列化、压缩和加密。我需要生成的文件尽可能快地创建,占用尽可能少的空间,且尽可能难以阅读。”我进行了一些测试,使用GZipStream压缩(使用我的AES算法加密的字符串)会使其变长,因此这没有任何意义。我选择了AES(其中RIjndael加密是其子集),因为这使我能够在.NET和较新的UAP(WinRT)应用程序之间共享代码。 - Hans Hinnekint

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接