2013-07-03 8 views
7

मैंने एमएसडीएन पर उदाहरणों का उपयोग करके एक्सएमएल दस्तावेजों को एन्क्रिप्ट और डिक्रिप्ट करने में कामयाब रहा है। http://msdn.microsoft.com/en-us/library/ms229744.aspx और http://msdn.microsoft.com/en-us/library/ms229943.aspxएक्स 50 9 प्रमाणपत्रों के साथ एकाधिक प्राप्तकर्ताओं के लिए एक्सएमएल एन्क्रिप्शन और डिक्रिप्शन

यह सब W3C XML एन्क्रिप्शन मानक (एक्सएमएल पूर्वी नौसेना कमान) के अनुसार किया जाता है।

यह सब अच्छा काम करता है। मेरी समस्या यह है कि एक एक्सएमएल दस्तावेज़ 2 या 3 प्राप्तकर्ताओं के लिए है। मैं एकाधिक कुंजी (X509 प्रमाणपत्र सार्वजनिक कुंजी) के साथ एक ही एक्सएमएल एन्क्रिप्ट करना चाहता हूं ताकि दस्तावेज़ एकाधिक प्राप्तकर्ताओं द्वारा डिक्रिप्ट किया जा सके।

एन्क्रिप्टेड सममित सत्र कुंजी वाले एकाधिक एन्क्रिप्शन कुंजी तत्वों का उपयोग करके डब्ल्यू 3 सी एक्सएमएल एन्क्रिप्शन मानक के अनुसार यह सब संभव है।

मुझे मानक क्रिप्टोग्राफी कक्षाओं का उपयोग करके नेट में इसे कैसे प्राप्त किया जाए, इस पर कोई उदाहरण नहीं मिला।

यह .NET C# में लागू किया जाना चाहिए।

क्या ऐसा करने या कोड उदाहरण कहीं करने का कोई तरीका है?

+0

स्टैक ओवरफ्लो में आपका स्वागत है, और दिलचस्प प्रश्न के लिए धन्यवाद। आइए आशा करते हैं कि पर्याप्त .NET ज्ञान वाले किसी को इसका जवाब मिल सके। ध्यान दें कि आपको हमेशा एक भाषा टैग शामिल करना चाहिए। हालांकि आपको भाषा को शीर्षक में रखने की जरूरत नहीं है। –

+0

मैं भी एक सी # डेवलपर नहीं हूं, लेकिन मुझे लगता है कि स्टैक ओवरफ्लो को यह पता होना चाहिए ... –

+0

मुझे यह अच्छा विचार नहीं लगता: http://arstechnica.com/business/2011/10/researchers-break-w3c-encryption - मानक-के-एक्सएमएल /, यहां [पेपर] है (http://www.nds.ruhr-uni-bochum.de/media/nds/veroeffentlichungen/2011/10/22/HowToBreakXMLenc.pdf)। –

उत्तर

4

एन्क्रिप्टेड एलीमेंट क्लास जितनी चाहें उतनी एन्क्रिप्टेड किय ले सकती है। जब तक अन्य पार्टी सही ढंग से उनके EncryptedKey (प्राप्तकर्ता या KeyInfoName तत्वों का उपयोग कर) की पहचान कर सकते हैं, आप किसी भी समस्या नहीं होनी चाहिए:

// example xml 
XmlDocument xdoc = new XmlDocument(); 
xdoc.PreserveWhitespace = true; 
xdoc.LoadXml(@"<root><encryptme>hello world</encryptme></root>"); 

var elementToEncrypt = (XmlElement)xdoc.GetElementsByTagName("encryptme")[0]; 

// keys 
// rsa keys would normally be pulled from a store 
RSA rsaKey1 = new RSACryptoServiceProvider(); 
RSA rsaKey2 = new RSACryptoServiceProvider(); 
var publicKeys = new[] { rsaKey1, rsaKey2 }; 

string sessKeyName = "helloworldkey"; 
var sessKey = new RijndaelManaged() { KeySize = 256 }; 

// encrypt 
var encXml = new EncryptedXml(); 
var encryptedElement = new EncryptedData() 
{ 
    Type = EncryptedXml.XmlEncElementUrl, 
    EncryptionMethod = new EncryptionMethod(EncryptedXml.XmlEncAES256Url), 
    KeyInfo = new KeyInfo() 
}; 
encryptedElement.CipherData.CipherValue = encXml.EncryptData(elementToEncrypt, sessKey, false); 
encryptedElement.KeyInfo.AddClause(new KeyInfoName(sessKeyName)); 

// encrypt the session key and add keyinfo's 
int keyID = 0; 
foreach (var pk in publicKeys) 
{ 
    var encKey = new EncryptedKey() 
    { 
     CipherData = new CipherData(EncryptedXml.EncryptKey(sessKey.Key, pk, false)), 
     EncryptionMethod = new EncryptionMethod(EncryptedXml.XmlEncRSA15Url), 
     Recipient = string.Format("recipient{0}@foobar.com", ++keyID), 
     CarriedKeyName = sessKeyName, 
    }; 
    encKey.KeyInfo.AddClause(new KeyInfoName(encKey.Recipient)); 
    encryptedElement.KeyInfo.AddClause(new KeyInfoEncryptedKey(encKey)); 
} 

// update the xml 
EncryptedXml.ReplaceElement(elementToEncrypt, encryptedElement, false); 

// show the result 
Console.Write(xdoc.InnerXml); 
Console.ReadLine(); 
Console.WriteLine(new string('-', 80)); 

उत्पादन

<root> 
    <EncryptedData Type="http://www.w3.org/2001/04/xmlenc#Element" xmlns="http://www.w3.org/2001/04/xmlenc#"> 
     <EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#aes256-cbc" /> 
     <KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#"> 
      <KeyName>helloworldkey</KeyName> 
      <EncryptedKey Recipient="[email protected]" xmlns="http://www.w3.org/2001/04/xmlenc#"> 
       <EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#rsa-1_5" /> 
       <KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#"> 
        <KeyName>[email protected]</KeyName> 
       </KeyInfo> 
       <CipherData> 
        <CipherValue>bmVT4SuAgWto6NJoTnUhrwaQ5/bWx39WKfs8y/QEQbaEBqdvl2Wa3woQGZxfigZ2wsWZQJFW0YGMII0W6AATnsqGOOVEbdGxmnvXRISiRdhcyNHkHot0kDK987y446ws5CZQQuz8inGq/SNrhiK6RyVnBE4ykWjrJyIS5wScwqA=</CipherValue> 
       </CipherData> 
       <CarriedKeyName>helloworldkey</CarriedKeyName> 
      </EncryptedKey> 
      <EncryptedKey Recipient="[email protected]" xmlns="http://www.w3.org/2001/04/xmlenc#"> 
       <EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#rsa-1_5" /> 
       <KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#"> 
        <KeyName>[email protected]</KeyName> 
       </KeyInfo> 
       <CipherData> 
        <CipherValue>oR8NPTm1NasWeDXBjayLk+p9/5RTWOZwNJHUMTQpZB9v1Aasi75oSjGqSqN0HMTiviw6NWz8AvHB9+i08L4Hw8JRDLxZgjaKqTGu31wXmM3Vc0CoYQ15AWMZN4q4tSxDhwuT8fp9SN+WFBm+M3w3bcPoooAazzDHK3ErzfXzYiU=</CipherValue> 
       </CipherData> 
       <CarriedKeyName>helloworldkey</CarriedKeyName> 
      </EncryptedKey> 
     </KeyInfo> 
     <CipherData> 
      <CipherValue>ohjWIEFf2WO6v/CC+ugd7uxEKGJlxgdT9N+t3MhoTIyXHqT5VlknWs0XlAhcgajkxKFjwVO3p413eRSMTLXKCg==</CipherValue> 
     </CipherData> 
    </EncryptedData> 
</root> 

दस्तावेज़ को डिक्रिप्ट करने के लिए आपको

// Decrypt 
string myKeyName = "[email protected]"; 

// specify we want to use the key for recipient1 
var encryptedDoc = new EncryptedXml(xdoc); 
encryptedDoc.AddKeyNameMapping(myKeyName, rsaKey1); 
encryptedDoc.Recipient = myKeyName; 

// Decrypt the element. 
encryptedDoc.DecryptDocument(); 

// show the result 
Console.Write(xdoc.InnerXml); 
Console.ReadLine(); 

परिणाम::

कुंजी नाम और प्रमाणपत्र के निजी कुंजी के बीच मैपिंग प्रदान
<root><encryptme>hello world</encryptme></root> 
+1

मैं मूल पूछताछ के फैसले का इंतजार करूंगा, लेकिन यह अच्छा दिख रहा है। मैं नेमस्पेस (digsig?) के बारे में थोड़ा आश्चर्यचकित हूं, लेकिन 'SignedInfo' में दो प्राप्तियां ... यह होना चाहिए। –

+0

यह मेरे द्वारा किए गए समाधान के समान ही है, लेकिन अगर मैं पहले के बजाय दूसरे कुंजी नाम का उपयोग करके डिक्रिप्ट करने का प्रयास करता हूं तो मुझे अपवाद मिलता है। मैंने आपके कोड की कोशिश की और ऐसा लगता है कि यह एक ही मुद्दा है। – RogerN

+1

@RogerN, ऐसा लगता है कि मुझे एक KeyInfo तत्व गुम था। डिक्रिप्ट करते समय आपको एन्क्रिप्टेड एक्सएमएल ऑब्जेक्ट पर प्राप्तकर्ता फ़ील्ड निर्दिष्ट करना होगा। अब तय किया जाना चाहिए। – Mitch

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