Как мне прочитать / записать зашифрованный XML-файл, используя LINQ to XML? - PullRequest
5 голосов
/ 06 ноября 2008

Я хотел бы читать / записывать зашифрованные XML-файлы, используя LINQ to XML. Кто-нибудь знает, как использовать алгоритмы шифрования, встроенные в .NET Framework, для шифрования потока, используемого объектом XDocument?

Я попробовал, но вы не можете установить CryptoStream для доступа на чтение / запись. Он поддерживает только чтение или запись, в результате чего LINQ to XML создает исключение.

Обновление: было бы неплохо читать / писать документ "на лету", но мне нужно только прочитать зашифрованный XML-файл, манипулировать им, а затем записать его обратно зашифрованным снова.

Ответы [ 2 ]

8 голосов
/ 06 ноября 2008

Самый простой подход - это, вероятно, 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 голосов
/ 06 ноября 2008

[обновление: спасибо Корбину Марчу, который (в то же время) написал то же самое, но в коде!]

Большинство потоков являются односторонними. Я полагаю, вам нужно:

  • создать CryptoStream чтение из (файла и т. Д.)
  • читать данные (например, в XDocument)
  • сделать код (прочитать документ, внести изменения и т. Д.)
  • Ящик для новой CryptoStream записи в (файл и т. Д.) [Начиная с того же IV и т. Д.)
  • сохранить документ в потоке

В зависимости от того, что является основным потоком (FileStream, MemoryStream и т. Д.), Вам также может потребоваться полностью закрыть / повторно открыть его между чтением и записью (т. Е. CryptoStream, вероятно, будет ощущать владение базовый поток, и будет .Close() это).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...