/ / LINQ to XMLを使用して暗号化されたXMLファイルを読み書きするにはどうすればよいですか? - .net、xml、linq、暗号化、linq-to-xml

LINQ to XMLを使用して暗号化されたXMLファイルを読み書きするにはどうすればよいですか? - .net、xml、linq、暗号化、linq-to-xml

LINQ to XMLを使って暗号化されたXMLファイルを読み書きしたいと思います。誰もがXDocumentオブジェクトによって使用されるストリームを暗号化するために.NET Frameworkに組み込まれた暗号化アルゴリズムを使用する方法を知っていますか?

私は試してみましたが、CryptoStreamを読み取り/書き込みアクセスに設定することはできません.LINQ to XMLが例外をスローする原因となる読み取りまたは書き込みのみをサポートしています。

アップデート:文書を "オンザフライ"で読み書きすることはいいですが、暗号化されたxmlファイルを読み込んで操作し、再度暗号化して書き戻す必要があります。

回答:

回答№1は8

最も簡単なアプローチは、おそらくXDocument.Load()、Linq around、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に入れ替えます。


回答№2の場合は0

[更新:Corbin Marchへの賞、(同じ時に)同じコードを書いた!)

ほとんどのストリーム 一方通行。私はあなたが "

  • 作成する CryptoStream (ファイルなどから)
  • データを読み込みます( XDocument
  • あなたのコードを書いてください(文書を読み、変更するなど)
  • 新しい箱を作る CryptoStream (ファイルなど)への書き込み[同じIVなどで始まります)
  • ドキュメントにストリームを保存する

基本となるストリームの種類に応じて(FileStream, MemoryStream、など)、あなたはまた、読み取りと書き込みの間でそれを完全に閉じる/再オープンする必要があります。 CryptoStream おそらくベースストリームの所有権を感じるでしょうし、 .Close() それ)。