代码之家  ›  专栏  ›  技术社区  ›  Chris Pietschmann

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

  •  5
  • Chris Pietschmann  · 技术社区  · 16 年前

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

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

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

    2 回复  |  直到 13 年前
        1
  •  8
  •   Corbin March    16 年前

    最简单的方法可能是XDocument。Load(),Linq,然后XDocument。保存()。从快速测试应用程序(轻松使用未处置的资源):

    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。

        2
  •  0
  •   Marc Gravell    16 年前

    [更新:向Corbin March致敬,他(在同一时间)写了同样的东西,但用的是代码!]

    大多数溪流 一种方式。我想你必须:

    • 创建a CryptoStream 从(文件等)读取
    • 读取数据(例如 XDocument )
    • 编写代码(阅读文档、进行更改等)
    • 装一个新的 标准接口 写入(文件等)[以相同的IV等开头)
    • 将文档保存到流中

    取决于底层流是什么( FileStream , MemoryStream 等),您可能还必须在读写之间完全关闭/重新打开它(即 标准接口 可能会感觉到对基本流的所有权,并且会 .Close()

    推荐文章