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 对象