c# .Net ढांचा अद्यतन के बाद एन्क्रिप्टेड एक्सएमएल डिक्रिप्ट डॉक्यूमेंट विधि त्रुटि




xml encryption (3)

मैं बहुत कुछ इसी तरह आज में चला गया जो .NET 4.6.2 में एक बग बन गया: https://github.com/Microsoft/dotnet/issues/341

इस मुद्दे के अनुसार, दो कामकाज हैं:

1) ओएस को विंडोज सर्वर 2012 आर 2 या नए में नवीनीकृत करना, 2) उपयोगकर्ता प्रोफ़ाइल को लोड करना।

मेरे पास 2013 में लिखा गया एक पुराने फ़ंक्शन है जो डिक्रिप्ट एक्सएमएल है जो किसी अन्य प्रोग्राम द्वारा एन्क्रिप्ट किया गया था।

कोड वास्तव में सरल है

        public static void Decrypt(XmlDocument Doc)
    {
        // Check the arguments.  
        if (Doc == null)
            throw new ArgumentNullException("Doc");

        // Create a new EncryptedXml object.
        EncryptedXml exml = new EncryptedXml(Doc);

        // Decrypt the XML document.
        exml.DecryptDocument();

    }

यह हाल तक एक जादू की तरह काम करता है कि हमारे कुछ क्लाइंट ने अपने ढांचे को 4.6.2 में अपग्रेड करना शुरू कर दिया, इसलिए विधि डिक्रिप्ट डॉक्युमेंट () ने काम करना बंद कर दिया अब यह एक अपवाद फेंकता है "एल्गोरिथम समूह '' अमान्य है '' अगर मैं .NET Framework 4.6.2 को हटाता हूं तो यह फिर से काम करता है।

इस लिंक में नमूना कोड त्रुटि को पुन: उत्पन्न कर देगा, यह सफलतापूर्वक एन्क्रिप्ट करेगा तो डिक्रिप्ट करने में विफल होगा।

मैं ए 3 प्रमाण पत्र, पेन्ड्रिव टोकन का उपयोग कर रहा हूं। किसी ने इस समस्या का सामना किया है? 4.6.2 में लगभग कोई काम है?

1 संपादित करें:

स्टैक ट्रेस:

at System.Security.Cryptography.CngAlgorithmGroup..ctor(String algorithmGroup) at System.Security.Cryptography.CngKey.get_AlgorithmGroup() at System.Security.Cryptography.RSACng..ctor(CngKey key) at System.Security.Cryptography.X509Certificates.RSACertificateExtensions.GetRSAPrivateKey(X509Certificate2 certificate) at System.Security.Cryptography.CngLightup.GetRSAPrivateKey(X509Certificate2 cert) at System.Security.Cryptography.Xml.EncryptedXml.DecryptEncryptedKey(EncryptedKey encryptedKey) at System.Security.Cryptography.Xml.EncryptedXml.GetDecryptionKey(EncryptedData encryptedData, String symmetricAlgorithmUri) at System.Security.Cryptography.Xml.EncryptedXml.DecryptDocument() at Criptografar.Program.Decrypt(XmlDocument Doc) in C:\Users\leoka\Documents\Visual Studio 2017\Projects\ConsoleApp4\Criptografar\Program.cs:line 152 at Criptografar.Program.Main(String[] args) in C:\Users\leoka\Documents\Visual Studio 2017\Projects\ConsoleApp4\Criptografar\Program.cs:line 83



मैं इस समस्या को पुन: उत्पन्न नहीं कर सकता हूं - मेरे पास "पेंड्रीव टोकन" नहीं है, जिस पर मुझे संदेह है कि समस्या है - तो यह अनुमान है। विंडोज में क्रिप्टोग्राफ़िक एपीआई की दो पीढ़ी हैं - "पुरानी" एक और "नई पीढ़ी" एक, सीएनजी के रूप में जाना जाता है अब, यदि आप CngLightup प्रकार के लिए सोर्स कोड को CngLightup जो आपके स्टैक ट्रेस के माध्यम से, विशेष रूप से DetectRsaCngSupport विधि के माध्यम से प्रकट होता है, तो आप देखेंगे कि .NET ढांचे नई पीढ़ी एपीआई का उपयोग करने की कोशिश करता है यदि संभव हो मेरा अनुमान है कि "पेंड्रीव टोकन" डिवाइस नए एपीआई का समर्थन नहीं करता है। आप पुराने एपीआई के इस्तेमाल को मजबूती से सत्यापित कर सकते हैं। दुर्भाग्यवश, यह नियंत्रित करने वाला एक सार्वजनिक कॉन्फ़िगरेशन फ़्लैग नहीं लगता है, इसलिए आपको प्रतिबिंब-आधारित हैक्स का सहारा लेना होगा। उदाहरण के लिए, आप अपने कार्यक्रम की शुरुआत में ऐसा कुछ कर सकते हैं, ताकि आप एक बार चला सकें, इससे पहले कि आप डिक्रिप्टिंग ऑपरेशन का प्रयास करें:

    var cngLightupType = typeof(EncryptedXml).Assembly.GetType("System.Security.Cryptography.CngLightup");
    var preferRsaCngField = cngLightupType.GetField("s_preferRsaCng", BindingFlags.Static | BindingFlags.NonPublic);
    var getRsaPublicKeyField = cngLightupType.GetField("s_getRsaPublicKey", BindingFlags.Static | BindingFlags.NonPublic);
    var getRsaPrivateKeyField = cngLightupType.GetField("s_getRsaPrivateKey", BindingFlags.Static | BindingFlags.NonPublic);
    preferRsaCngField.SetValue(null, new Lazy<bool>(() => false));
    getRsaPublicKeyField.SetValue(null, null);
    getRsaPrivateKeyField.SetValue(null, null);

ध्यान दें कि यह बेहद हैकी है, धागा-सुरक्षित नहीं, त्रुटि से निपटने आदि नहीं छोड़ी गई है। यदि आप यह सत्यापित करते हैं कि सीएनजी उपयोग समस्या है, तो आप सीएनजी के साथ काम करने वाले ड्राइवरों को प्रदान करने के लिए "पेंड्रीव टोकन" सप्लायर से पूछ सकते हैं। या आप ऊपर हैक के साथ रह सकते हैं, अधिक सुरक्षा के लिए फिर से लिखा।





encryption-asymmetric