如何使用LINQ to XML读取/写入加密的XML文件?

时间:2008-11-06 02:08:11

标签: .net xml linq encryption linq-to-xml

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

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

更新:“动态”读取/写入文档会很不错,但我只需要读取加密的xml文件,对其进行操作,然后再将其写回加密。

2 个答案:

答案 0 :(得分: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。

答案 1 :(得分:0)

[更新:感谢Corbin March,他(在同一时间)写了同样的内容,但在代码中!]

大多数流都是单向的。我想你必须:

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

根据底层流的内容(FileStreamMemoryStream等),您可能还必须在读写之间完全关闭/重新打开它(即{{1}可能会感觉到基流的所有权,并且会CryptoStream它。