我想使用 LINQ to XML 读/写加密的 XML 文件。有谁知道如何使用 .NET Framework 中内置的加密算法来加密 XDocument 对象使用的 Stream?
我确实尝试过,但您不能将 CryptoStream 设置为读/写访问。它仅支持读取或写入,这会导致 LINQ to XML 引发异常。
更新:“即时”读/写文档会很好,但我只需要读取加密的 xml 文件,对其进行操作,然后再次将其写回加密。
我想使用 LINQ to XML 读/写加密的 XML 文件。有谁知道如何使用 .NET Framework 中内置的加密算法来加密 XDocument 对象使用的 Stream?
我确实尝试过,但您不能将 CryptoStream 设置为读/写访问。它仅支持读取或写入,这会导致 LINQ to XML 引发异常。
更新:“即时”读/写文档会很好,但我只需要读取加密的 xml 文件,对其进行操作,然后再次将其写回加密。
最简单的方法可能是 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。
[更新:向 Corbin March 致敬,他(在同一时间)写了同样的东西,但在代码中!]
大多数流是一种方式。我想你必须:
CryptoStream
读数XDocument
)CryptoStream
写入[从相同的 IV 等开始)根据底层流是什么(FileStream
,MemoryStream
等),您可能还必须在读取和写入之间完全关闭/重新打开它(即,CryptoStream
可能会感觉到基础流的所有权,并且会这样做.Close()
)。