/ / Come faccio a leggere / scrivere un file XML crittografato usando LINQ to XML? - .net, xml, linq, encryption, linq-to-xml

Come faccio a leggere / scrivere un file XML crittografato usando LINQ to XML? - .net, xml, linq, encryption, linq-to-xml

Mi piacerebbe leggere / scrivere file XML crittografati usando LINQ in XML. Qualcuno sa come utilizzare gli algoritmi di crittografia incorporati in .NET Framework per crittografare il flusso utilizzato dall'oggetto XDocument?

L'ho provato, ma non è possibile impostare CryptoStream in accesso in lettura / scrittura, ma supporta solo la lettura o la scrittura, che fa sì che LINQ to XML generi un'eccezione.

Aggiornamento: Sarebbe bello leggere / scrivere il documento "al volo", ma mi viene richiesto solo di leggere il file xml crittografato, manipolarlo, quindi riscriverlo nuovamente crittografato.

risposte:

8 per risposta № 1

L'approccio più semplice è probabilmente un XDocument.Load (), Linq around, quindi XDocument.Save (). Da un'app di prova rapida (facile con risorse non disposte):

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

Scambia il tuo ICryptoTransform preferito nel CryptoStream.


0 per risposta № 2

[aggiornamento: complimenti a Corbin March, che (nello stesso tempo) ha scritto la stessa cosa, ma nel codice!]

La maggior parte dei flussi siamo senso unico. Immagino che dovresti:

  • creare un CryptoStream lettura dal (file ecc.)
  • leggere i dati (ad esempio in XDocument)
  • fai il tuo codice (leggi il documento, apporta le modifiche, ecc.)
  • cassa una nuova CryptoStream scrivendo al (file etc) [iniziando con la stessa IV ecc.)
  • salva il docuemnt nello stream

A seconda di quale sia il flusso sottostante (FileStream, MemoryStream, ecc.) potrebbe anche essere necessario chiuderlo / riaprirlo completamente tra la lettura e la scrittura (ad es CryptoStream probabilmente sentirà la proprietà del flusso di base, e lo farà .Close() esso).