2009-07-06 11 views
7

मुझे एन्क्रिप्ट करने के लिए दो विधियों की आवश्यकता है और एक xml फ़ाइल को एक कुंजी = "हैलो वर्ल्ड" के साथ डिक्रिप्ट करने के लिए, कुंजी हैलो वर्ल्ड का उपयोग एन्क्रिप्ट और एक्सएमएल फ़ाइल को डिक्रिप्ट करने के लिए किया जाना चाहिए। इन विधियों को काम करना चाहिए सभी मशीनों पर !!! कोई एन्क्रिप्शन विधियां करेंगे। नीचे एक्सएमएल फ़ाइल सामग्री:सी # एक एक्सएमएल फ़ाइल एन्क्रिप्ट करें

<root> 
    <lic> 
     <number>19834209</number> 
     <expiry>02/02/2002</expiry> 
    </lic> 
</root> 

कुछ मुझे एक नमूना दे सकते हैं इस मुद्दे MSDN नमूना encyptions एक xml फ़ाइल encypted बनाने लेकिन जब मैं एक और मशीन पर डिक्रिप्ट यह work.For उदाहरण नहीं करता है

मैंने इस नमूने की कोशिश की: How to: Encrypt XML Elements with Asymmetric Keys, लेकिन यहां कुछ प्रकार का सत्र है और दूसरी मशीन पर यह खराब डेटा पुफ कहते हैं!

+1

अपने कोड की एक छोटी सी उदाहरण पोस्ट करें, और वास्तव में क्या काम नहीं करता है (उदाहरण के लिए 'लाइन 12 पर मैं एक compilor त्रुटि 12345 प्राप्त', या 'है रनटाइम मुझे लाइन 15 पर सुरक्षा अपवाद मिलता है)। – Treb

+1

encyption class ah well द्वारा खराब डेटा – abmv

+1

क्या आपको इसे छिपाने के लिए डेटा एन्क्रिप्ट करने की आवश्यकता है, या केवल डेटा को परिवर्तन से सुरक्षित रखें? – sisve

उत्तर

13

यदि आप एन्क्रिप्टिंग और डिक्रिप्ट करने के लिए एक ही कुंजी चाहते हैं तो आपको एक सममित विधि (वास्तव में परिभाषा है) का उपयोग करना चाहिए। यहां आपके नमूने (उसी स्रोत) के सबसे नज़दीक हैं। http://msdn.microsoft.com/en-us/library/sb7w85t6.aspx

पोस्ट किया गया नमूना काम नहीं कर रहा है क्योंकि वे एक ही कुंजी का उपयोग नहीं कर रहे हैं। न केवल विभिन्न मशीनों पर: एक ही मशीन पर प्रोग्राम चलाने से दो बार काम नहीं करना चाहिए (मेरे लिए काम नहीं किया), क्योंकि वे हर बार अलग-अलग यादृच्छिक कुंजी का उपयोग करते हैं।
कोशिश अपने प्रमुख बनाने के बाद यह कोड जोड़ने:

key = new RijndaelManaged(); 

string password = "Password1234"; //password here 
byte[] saltBytes = Encoding.UTF8.GetBytes("Salt"); // salt here (another string) 
var p = new Rfc2898DeriveBytes(password, saltBytes); //TODO: think about number of iterations (third parameter) 
// sizes are devided by 8 because [ 1 byte = 8 bits ] 
key.IV = p.GetBytes(key.BlockSize/8); 
key.Key = p.GetBytes(key.KeySize/8); 

अब कार्यक्रम एक ही कुंजी और प्रारंभिक वेक्टर उपयोग कर रहा है, और एन्क्रिप्ट और डिक्रिप्ट सभी मशीनों पर काम करना चाहिए।
इसके अलावा, key से algorithm नाम बदलने पर विचार करें, अन्यथा यह बहुत भ्रामक है। मैं कहूंगा कि यह एक खराब, काम नहीं कर रहा है-एमएसडीएन से अच्छा उदाहरण है।

नोट: PasswordDeriveBytes.GetBytes() गंभीर PasswordDeriveBytes वर्ग के भीतर मुद्दों (सुरक्षा) की वजह से मान्य नहीं है। उपर्युक्त कोड को इसके बजाय सुरक्षित Rfc2898DeriveBytes कक्षा (पीबीकेडीएफ 1 के बजाय पीबीकेडीएफ 2) का उपयोग करने के लिए फिर से लिखा गया है। ऊपर दिए गए कोड को PasswordDeriveBytes का उपयोग करके समझौता किया जा सकता है।

यह भी देखें: Recommended # of iterations when using PKBDF2-SHA256?

+0

मैंने उस नमूने की कोशिश की, अगर मैं केवल डिक्रिप्ट करता हूं, तो एन्क्रिप्ट करें और फिर एनक्रिप्ट को टिप्पणी करें और डिक्रिप्ट काम नहीं करता है? क्यूं कर? – abmv

+0

धन्यवाद, उन msdn दोस्तों को डर, ठीक है तुमने मेरा दिन बचाया। आपके लिए समय और संसाधन फिर से धन्यवाद। – abmv

+1

जैसे मुझे इन सभी जटिल एन्क्रिप्शन सामानों को समझने में समय मिल गया। मैं वास्तव में एमएसडीएन पढ़कर समझने की कोशिश कर रहा था, लेकिन अगर वे इसे ठीक से समझा नहीं सकते हैं तो कौन और कर सकता है। आपको फ़ाइल को समझने के लिए पूरी क्रिप्टोग्राफिक थ्योरी को समझने की आवश्यकता नहीं है। खैर। नेट में कक्षाएं हैं और मुझे बस अपना समय बचाने के लिए उनका उपयोग करने की ज़रूरत है! और मैं आपको एक उदाहरण देता हूं, कम से कम इसे विभिन्न मशीनों पर काम करना चाहिए! – abmv

4

कूलर नहीं होगा अगर आप < एलआईसी > तत्व हस्ताक्षर करने के लिए एक निजी कुंजी का इस्तेमाल किया और (शायद एक < हैश > तत्व में) फाइल करने के लिए परिणाम गयी। यदि संभवतः आपके समर्थन को लाइसेंस नंबर, या समाप्ति की तारीख जानने की आवश्यकता है, तो यह संभवतः सभी को xml फ़ाइल पढ़ने के लिए संभव बनाता है, लेकिन वे निजी कुंजी के बिना किसी भी मूल्य को नहीं बदल सकते हैं।

हस्ताक्षर सत्यापित करने के लिए आवश्यक सार्वजनिक कुंजी सामान्य ज्ञान होगी।

स्पष्टीकरण
प्रवेश करने से आपकी कोड केवल परिवर्तन के खिलाफ यह रक्षा करेगा, यह छिपा उस में कोई भी जानकारी शामिल नहीं होंगे। आपका मूल प्रश्न एन्क्रिप्शन का उल्लेख करता है, लेकिन मुझे यकीन नहीं है कि डेटा को छिपाने की आवश्यकता है, या बस इसे संशोधन से सुरक्षित रखें।

उदाहरण कोड: (कभी भी PrivateKey.key प्रकाशित नहीं करें। XMLMethods को केवल xml फ़ाइल पर हस्ताक्षर करते समय आवश्यक है, क्लाइंट Methods केवल xml फ़ाइल को सत्यापित करते समय आवश्यक हैं।) सब से

using System; 
using System.Diagnostics; 
using System.IO; 
using System.Security.Cryptography; 
using System.Text; 
using System.Xml; 

public static class Program { 
    public static void Main() { 
     if (!File.Exists("PublicKey.key")) { 
      // Assume first run, generate keys and sign document. 
      ServerMethods.GenerateKeyPair(); 

      var input = new XmlDocument(); 
      input.Load("input.xml"); 
      Debug.Assert(input.DocumentElement != null); 

      var licNode = input.DocumentElement["lic"]; 
      Debug.Assert(licNode != null); 

      var licNodeXml = licNode.OuterXml; 
      var signedNode = input.CreateElement("signature"); 
      signedNode.InnerText = ServerMethods.CalculateSignature(licNodeXml); 
      input.DocumentElement.AppendChild(signedNode); 

      input.Save("output.xml"); 
     } 

     if (ClientMethods.IsValidLicense("output.xml")) { 
      Console.WriteLine("VALID"); 
     } else { 
      Console.WriteLine("INVALID"); 
     } 
    } 

    public static class ServerMethods { 
     public static void GenerateKeyPair() { 
      var rsa = SharedInformation.CryptoProvider; 

      using (var keyWriter = File.CreateText("PublicKey.key")) 
       keyWriter.Write(rsa.ToXmlString(false)); 

      using (var keyWriter = File.CreateText("PrivateKey.key")) 
       keyWriter.Write(rsa.ToXmlString(true)); 
     } 

     public static string CalculateSignature(string data) { 
      var rsa = SharedInformation.CryptoProvider; 
      rsa.FromXmlString(File.ReadAllText("PrivateKey.key")); 

      var dataBytes = Encoding.UTF8.GetBytes(data); 
      var signatureBytes = rsa.SignData(dataBytes, SharedInformation.HashAlgorithm); 
      return Convert.ToBase64String(signatureBytes); 
     } 
    } 

    public static class ClientMethods { 
     public static bool IsValid(string data, string signature) { 
      var rsa = SharedInformation.CryptoProvider; 
      rsa.FromXmlString(File.ReadAllText("PublicKey.key")); 

      var dataBytes = Encoding.UTF8.GetBytes(data); 
      var signatureBytes = Convert.FromBase64String(signature); 
      return rsa.VerifyData(dataBytes, SharedInformation.HashAlgorithm, signatureBytes); 
     } 

     public static bool IsValidLicense(string filename) { 
      var doc = new XmlDocument(); 
      doc.Load(filename); 

      var licNode = doc.SelectSingleNode("/root/lic") as XmlElement; 
      var signatureNode = doc.SelectSingleNode("/root/signature") as XmlElement; 
      if (licNode == null || signatureNode == null) return false; 

      return IsValid(licNode.OuterXml, signatureNode.InnerText); 
     } 
    } 

    public static class SharedInformation { 
     public static int KeySize { 
      get { return 1024; } 
     } 

     public static string HashAlgorithm { 
      get { return "SHA512"; } 
     } 

     public static RSACryptoServiceProvider CryptoProvider { 
      get { return new RSACryptoServiceProvider(KeySize, new CspParameters()); } 
     } 
    } 
} 
+0

मैंने msdn से दो नमूने की कोशिश की लेकिन .. मुद्दा यह है कि मैं इसे एक diff मशीन पर ठीक से हटाने के लिए प्राप्त कर सकता हूं। – abmv

3

सबसे पहले, आप को एनक्रिप्ट और डीक्रिप्ट करने के लिए एक ही कुंजी का उपयोग करना चाहते हैं, तो आप सममित क्रिप्टोग्राफी पर गौर करना चाहिए। असममित क्रिप्टोग्राफी तब होती है जब एन्क्रिप्टिंग और डिक्रिप्टिंग की कुंजी अलग होती है। बस इतना है कि आप जानते हैं - आरएसए असममित है, ट्रिपलडेस और रिजेंडेल सममित हैं। अन्य भी हैं, लेकिन .NET के लिए उनके लिए डिफ़ॉल्ट कार्यान्वयन नहीं है।

मैं System.Security.Cryptography namespace का अध्ययन करने की सलाह दूंगा। और उन सभी चीजों के बारे में थोड़ा सीखना। इसमें आपको फ़ाइलों को एन्क्रिप्ट और डिक्रिप्ट करने की आवश्यकता है, साथ ही पासवर्ड भी उत्पन्न करना है। विशेष रूप से, आप इन कक्षाओं में रुचि हो सकती:

  • CryptoStream
  • PasswordDeriveBytes
  • RijndaelManaged

वहाँ भी उनमें से प्रत्येक के लिए MSDN में उपयोग के लिए उदाहरण हैं। आप इन वर्गों का उपयोग किसी भी फ़ाइल को एन्क्रिप्ट करने के लिए कर सकते हैं, न केवल एक्सएमएल। यदि आप केवल कुछ चुनिंदा तत्वों को एन्क्रिप्ट करना चाहते हैं, तो आप System.Security.Cryptography.Xml नामस्थान पर एक नज़र डाल सकते हैं। मुझे लगता है कि आप इसके बारे में पहले से ही एक लेख पा चुके हैं। उस पृष्ठ पर दिए गए लिंक का पालन करते रहें और आप उन वर्गों के बारे में और जानेंगे।

2
इस

कैसे आप डिजिटल दौरान प्रवेश करें और सत्यापित एक्सएमएल दस्तावेजों Sign XML Documents

+0

मैंने यहां उठाए गए समान प्रश्नों में से एक को भी देखा है http://stackoverflow.com/questions/1031856/digitally-sign-parts-of-a-xml- दस्तावेज़ – Eros

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