2008-11-06 48 views
5

我想使用LINQ to XML读取/写入加密的XML文件。有谁知道如何使用.NET Framework中内置的加密算法来加密XDocument对象使用的Stream?如何使用LINQ to XML读取/写入加密的XML文件?

我确实尝试过,但无法将CryptoStream设置为读/写访问。它只支持读取或写入,这会导致LINQ to XML抛出异常。

更新:这将是很好的读/写文件“即时”,但我只需要读取加密的XML文件,操纵它,然后再写回去加密。

+0

你能澄清你想要做什么吗?将整个文档读入内存,对其进行操作,然后再将其写出来 - 或者您需要能够随时读/写吗? – tvanfosson 2008-11-06 02:24:18

回答

8

最简单的方法可能是XDocument.Load(),Linq,然后是XDocument.Save()。从快速测试应用程序(去容易对非配置资源):

XDocument writeContacts = new XDocument(
    new XElement("contacts", 
     new XElement("contact", 
     new XElement("name", "Patrick Hines"), 
     new XElement("phone", "206-555-0144", 
      new XAttribute("type", "home")), 
     new XElement("phone", "425-555-0145", 
      new XAttribute("type", "work")), 
     new XElement("address", 
      new XElement("street1", "123 Main St"), 
      new XElement("city", "Mercer Island"), 
      new XElement("state", "WA"), 
      new XElement("postal", "68042") 
     ) 
    ) 
    ) 
); 

Rijndael RijndaelAlg = Rijndael.Create(); 

FileStream writeStream = File.Open("data.xml", FileMode.Create); 
CryptoStream cStream = new CryptoStream(writeStream, 
    RijndaelAlg.CreateEncryptor(RijndaelAlg.Key, RijndaelAlg.IV), 
    CryptoStreamMode.Write); 

StreamWriter writer = new StreamWriter(cStream); 

writeContacts.Save(writer); 

writer.Flush(); 
writer.Close(); 

FileStream readStream = File.OpenRead("data.xml"); 

cStream = new CryptoStream(readStream, 
    RijndaelAlg.CreateDecryptor(RijndaelAlg.Key, RijndaelAlg.IV), 
    CryptoStreamMode.Read); 

XmlTextReader reader = new XmlTextReader(cStream); 

XDocument readContacts = XDocument.Load(reader); 

//manipulate with Linq and Save() when needed 

交换自己喜欢的ICryptoTransform的到CryptoStream的。

+0

我试着用AesManaged类来做这个加密,而且它错误,因为它想读取/写入数据流。嗯...我会再试一次。谢谢。 – 2008-11-06 21:30:11

0

[更新:荣誉给科尔宾三月,谁(在同一时间)写的一样,但在代码]

大部分流的一种方式。我想你必须:

  • 创建CryptoStream从(文件等)
  • 读取数据(例如进入XDocument
  • 做你的代码阅读(阅读文档,进行更改,等)
  • 箱新CryptoStream写入到(文件等)[用相同的IV等)开始
  • 的docuemnt保存到流

根据底层数据流是什么(FileStream,MemoryStream等),你可能也必须在读和写之间完全关闭/重新打开它。 CryptoStream可能会感受到基本流的所有权,并且会.Close() it)。