C# - 从流中序列化/反序列化 DES 加密文件

Posted

技术标签:

【中文标题】C# - 从流中序列化/反序列化 DES 加密文件【英文标题】:C# - Serializing/Deserializing a DES encrypted file from a stream 【发布时间】:2009-06-08 13:56:59 【问题描述】:

有没有人有任何关于如何将序列化数据加密到文件然后使用 DES 读回的示例?

我已经编写了一些不起作用的代码,但我宁愿看到一个新的尝试,而不是追求我的代码。

编辑:抱歉,忘了说我需要一个使用 XmlSerializer.Serialize/Deserialize 的示例。

【问题讨论】:

顺便说一下,我使用的是CF,所以内存是一个限制。 您能详细说明一下吗?你想加密一些东西然后序列化成 XML 格式,还是你想加密序列化的数据? 哪个耗时少。我收集了一组需要加密到文件中的客户信息。我看到它工作的方式是通过加密流序列化到文件(有效),然后通过文件中的加密流反序列化(无效)。 【参考方案1】:

加密

public static void EncryptAndSerialize(string filename, MyObject obj, SymmetricAlgorithm key)

    using(FileStream fs = File.Open(filename, FileMode.Create))
    
        using(CryptoStream cs = new CryptoStream(fs, key.CreateEncryptor(), CryptoStreamMode.Write))
        
            XmlSerializer xmlser = new XmlSerializer(typeof(MyObject));
            xmlser.Serialize(cs, obj); 
        
    

解密:

public static MyObject DecryptAndDeserialize(string filename, SymmetricAlgorithm key)    

    using(FileStream fs = File.Open(filename, FileMode.Open))
    
        using(CryptoStream cs = new CryptoStream(fs, key.CreateDecryptor(), CryptoStreamMode.Read))
        
            XmlSerializer xmlser = new XmlSerializer(typeof(MyObject));
            return (MyObject) xmlser.Deserialize(cs);
        
    

用法:

DESCryptoServiceProvider key = new DESCryptoServiceProvider();
MyObject obj = new MyObject();
EncryptAndSerialize("testfile.xml", obj, key);
MyObject deobj = DecryptAndDeserialize("testfile.xml", key);

您需要将 MyObject 更改为您正在序列化的对象的任何类型,但这是一般的想法。诀窍是使用相同的 SymmetricAlgorithm 实例来加密和解密。

【讨论】:

看起来我们发布的时间差不多,我会接受,因为它已经足够接近我真正想要的了!谢谢布莱斯。 但是我如何从已知字符串中生成密钥?像“this_is_a_password_to_unlock_the_file”?这适用于您的“使用”案例,但如果您想保存密钥,然后使用它来解锁加密数据,我该怎么做? :// 知道了!使用特定密码加密:key.CreateEncryptor(Encoding.ASCII.GetBytes("64bitPas"), Encoding.ASCII.GetBytes("InitVector")),使用相同密码解密:key.CreateDecryptor(Encoding.ASCII.GetBytes("64bitPas"), Encoding.ASCII.GetBytes("InitVector"))【参考方案2】:

这个帖子给出了基本的想法。这是一个使函数通用的版本,还允许您传递加密密钥,因此它是可逆的。

public static void EncryptAndSerialize<T>(string filename, T obj, string encryptionKey) 
  var key = new DESCryptoServiceProvider();
  var e = key.CreateEncryptor(Encoding.ASCII.GetBytes("64bitPas"), Encoding.ASCII.GetBytes(encryptionKey));
  using (var fs = File.Open(filename, FileMode.Create))
  using (var cs = new CryptoStream(fs, e, CryptoStreamMode.Write))
      (new XmlSerializer(typeof (T))).Serialize(cs, obj);


public static T DecryptAndDeserialize<T>(string filename, string encryptionKey) 
  var key = new DESCryptoServiceProvider();
  var d = key.CreateDecryptor(Encoding.ASCII.GetBytes("64bitPas"), Encoding.ASCII.GetBytes(encryptionKey));
  using (var fs = File.Open(filename, FileMode.Open))
  using (var cs = new CryptoStream(fs, d, CryptoStreamMode.Read))
      return (T) (new XmlSerializer(typeof (T))).Deserialize(cs);

【讨论】:

-1 用于 CreateEncryptor 中的参数顺序错误和 DES 的无效初始化向量,并且它不会正确解密流(由于未刷新的加密流)。【参考方案3】:

Here is an example 对字符串进行 DES 加密/解密。

【讨论】:

抱歉,我需要一个使用 XmlSerializer 的示例。我将修改主要问题。

以上是关于C# - 从流中序列化/反序列化 DES 加密文件的主要内容,如果未能解决你的问题,请参考以下文章

使用 Newtonsoft Json 从流中反序列化多个 json 对象

一次反序列化json数组流一项

序列化流与反序列化流

C# Protobuf-net:如何从网络流中连续反序列化?

java序列化

2018-08-24Properties类+序列化+反序列化+FileUtils+FilenameUtils