2008-11-06 11 views
5

मैं LINQ से XML का उपयोग करके एन्क्रिप्टेड XML फ़ाइलों को पढ़ना/लिखना चाहता हूं। क्या किसी को पता है कि XDocument ऑब्जेक्ट द्वारा उपयोग किए गए स्ट्रीम को एन्क्रिप्ट करने के लिए .NET Framework में निर्मित एन्क्रिप्शन एल्गोरिदम का उपयोग कैसे करें?LINQ से XML का उपयोग करके एन्क्रिप्टेड XML फ़ाइल को मैं कैसे पढ़ूं/लिखूं?

मैंने कोशिश की, लेकिन आप क्रिप्टोस्ट्रीम को पढ़ने/लिखने के लिए सेट नहीं कर सकते। यह केवल पढ़ने या लिखने का समर्थन करता है, जो LINQ से XML को अपवाद फेंकने का कारण बनता है।

अद्यतन: "फ्लाई पर" दस्तावेज़ को पढ़ने/लिखना अच्छा लगेगा, लेकिन मुझे केवल एन्क्रिप्टेड एक्सएमएल फ़ाइल को पढ़ने की आवश्यकता है, इसे कुशल बनाना है, फिर इसे फिर से एन्क्रिप्ट किया गया है।

+0

क्या आप यह स्पष्ट कर सकते हैं कि आप क्या करना चाहते हैं? क्या पूरे दस्तावेज़ को स्मृति में पढ़ने, इसे चलाने के लिए पर्याप्त है, फिर इसे फिर से लिखना पर्याप्त है - या क्या आपको फ्लाई पर पढ़ने/लिखने में सक्षम होना चाहिए? – tvanfosson

उत्तर

8

सबसे आसान तरीका शायद एक एक्सडॉक्यूमेंट.लोड(), चारों ओर लिंक, फिर 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 

CryptoStream में स्वैप अपने पसंदीदा ICryptoTransform।

+0

मैंने एस्पेनेज्ड क्लास के साथ एन्क्रिप्शन करने की कोशिश की, और यह त्रुटि हुई क्योंकि यह स्ट्रीम को पढ़ने/लिखना चाहता था। हम्म ... मैं इसे फिर से कोशिश करूंगा। धन्यवाद। –

+0

आप चाबियाँ कैसे स्टोर करते हैं? –

+0

@ क्रिस - यह एप्लिकेशन पर निर्भर करता है। कभी-कभी आपको इसे स्टोर करने की आवश्यकता नहीं होती है। हो सकता है कि आप रनटाइम पर किसी उपयोगकर्ता से पासवर्ड स्वीकार करें और [Rfc2898DeriveBytes] (http://msdn.microsoft.com/en-us/library/system.security.cryptography.rfc2898derivebytes.aspx) का उपयोग करके कुंजी उत्पन्न करें। अन्य मामलों में, आप पासवर्ड को एक सुरक्षित कॉन्फ़िगरेशन स्थान में संग्रहीत करते हैं। मेरा उदाहरण केवल एन्क्रिप्ट/डिक्रिप्ट प्रक्रिया का प्रदर्शन है। आप एक वास्तविक ऐप में रिजांडाल-जेनरेट की गई कुंजी का उपयोग नहीं करना चाहते हैं क्योंकि यह प्रति तत्काल उत्पन्न होता है। –

0

[अद्यतन: कोर्बिन मार्च, जो (एक ही समय में) एक ही लिखा प्रशंसा, लेकिन कोड में]

अधिकांश धाराओं एक तरह से कर रहे हैं। मुझे लगता है कि आप चाहते हैं करने के लिए:

  • एक CryptoStream (फ़ाइल आदि)
  • (XDocument में उदाहरण के लिए) डेटा को पढ़ने
  • अपने कोड करना से पढ़ने बनाने (दस्तावेज़ पढ़, परिवर्तन करते हैं, आदि)
  • टोकरा (फ़ाइल आदि के लिए एक नया CryptoStream लेखन) [एक ही चतुर्थ आदि) के साथ शुरू
  • धारा
को docuemnt बचाने 210

अंतर्निहित धारा क्या है (FileStream, MemoryStream, आदि) के आधार पर आपको पढ़ने और लिखने के बीच इसे पूरी तरह से बंद/पुनः खोलना पड़ सकता है (यानी। CryptoStream शायद बेस-स्ट्रीम का स्वामित्व महसूस करेगा, और .Close() होगा)।

संबंधित मुद्दे