5

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

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

更新: ドキュメントを「オンザフライ」で読み書きできればよいのですが、暗号化された xml ファイルを読み込んで操作し、再び暗号化して書き戻すだけで済みます。

4

2 に答える 2

8

最も簡単な方法は、おそらく 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 に交換します。

于 2008-11-06T05:21:26.203 に答える
0

[更新: (同時に) コードで同じことを書いた Corbin March に敬意を表します!]

ほとんどのストリーム一方通行です。私はあなたがしなければならないと思います:

  • CryptoStream(ファイルなど)から読み取りを作成する
  • データを読み込みます (たとえば にXDocument)
  • コードを実行します(ドキュメントを読んだり、変更を加えたりします)
  • (ファイルなど)への新しいCryptoStream書き込みを作成する[同じIVなどで始まる]
  • ドキュメントをストリームに保存する

基になるストリームが何であるか ( 、 など) によってFileStreamMemoryStream、読み取りと書き込みの間でストリームを完全に閉じたり、再度開いたりする必要がある場合もあります (つまり、CryptoStreamはおそらくベースストリームの所有権を感じます.Close())。

于 2008-11-06T05:21:38.623 に答える