2015-01-02 3 views
5

मैं विंडोज़ पर आरएसए कुंजी जोड़े प्रबंधित करने के लिए एक उपकरण बना रहा हूं क्योंकि इसके लिए कोई अंतर्निहित कार्यक्षमता नहीं है और हम आरएसए एन्क्रिप्शन सुविधाओं का व्यापक उपयोग करते हैं। नेट।RSACryptoServiceProvider का उपयोग कर एक्सएमएल से आरएसए सार्वजनिक कुंजी आयात करना संपत्ति को सार्वजनिक रूप से झूठी

यह उपकरण मौजूदा आरएसए कुंजी जोड़े को सूचीबद्ध करने, नई चाबियाँ बनाने, चाबियाँ हटाने, चाबियाँ निर्यात करने और पहले बनाए गए एक्सएमएल निर्यात (एएसपीनेट_आरईजीआईआईएस.एक्सईई का उपयोग करके निर्यात) से आयात करने वाली कुंजी जैसे विभिन्न कार्यों को प्रदान करता है।

मेरे पास केवल एन्क्रिप्शन संचालन के लिए केवल सार्वजनिक कुंजी आयात करने के अलावा काम करने वाली सभी कार्यक्षमताएं हैं। जब मुख्य जोड़े मूल रूप से सर्वर पर बनाए जाते हैं, तो सार्वजनिक और सार्वजनिक/निजी निर्यात दोनों aspnet_regiis.exe का उपयोग कर XML पर किए जाते हैं।

मैं निजी मशीनों को पूरी तरह से आवश्यक होने तक वितरित होने से रोकने के लिए अन्य मशीनों पर कॉन्फ़िगरेशन फ़ाइलों को एन्क्रिप्ट करने का विकल्प प्रदान करने के लिए उत्सुक हूं।

प्रत्येक बार जब मैं प्रीवीउल्सी निर्यात किए गए एक्सएमएल ब्लॉक से PublicOnly संपत्ति की संपत्ति से सार्वजनिक कुंजी आयात करता हूं तो यह संकेत मिलता है कि कुंजी जोड़ी में सार्वजनिक और निजी कुंजी है। मैंने पुष्टि की है कि एक्सएमएल में निजी कुंजी जानकारी नहीं है इसलिए समस्या xml फ़ाइल के भीतर नहीं है।

समस्या CspParameters ऑब्जेक्ट का उपयोग करते समय और CspProviderFlags.UseMachineKeyStore के रूप में ध्वज निर्दिष्ट करते समय समस्या उत्पन्न होती है। यदि आप RSACryptoServiceProvider किसी भी सीएसपी पैरामीटर निर्दिष्ट किए बिना बनाते हैं और फिर xml से कुंजी आयात करते हैं, तो PublicOnly संपत्ति सही ढंग से गलत पर सेट होती है।

String xmlText = File.ReadAllText(filePath); 
RSACryptoServiceProvider csp = new RSACryptoServiceProvider(); 
csp.FromXmlString(xmlText); 
//csp.PublicOnly equals true; 

लेकिन जब से मैं तो यह एन्क्रिप्शन संचालन मैं जब एक RSACryptoServiceProvider निर्माण CspParameters वस्तु का उपयोग करने के लिए मजबूर कर रहा हूँ के लिए बाद में इस्तेमाल किया जा सकता के रूप में वहाँ कोई दूसरा रास्ता कुंजी नाम के लिए है यह कुंजी कंटेनर एक नाम देने की जरूरत है कंटेनर।

String xmlText = File.ReadAllText(filePath); 
CspParameters cspParams = new CspParameters(); 
cspParams.Flags = CspProviderFlags.UseMachineKeyStore; 
cspParams.KeyContainerName = keyContainerName; 
RSACryptoServiceProvider csp = new RSACryptoServiceProvider(cspParams); 
csp.PersistKeyInCsp = true; 
csp.FromXmlString(xmlText); 
//csp.PublicOnly equals false; 

मैंने इस कोड के विभिन्न संस्करणों को आजमाया है, हालांकि समस्या बनी हुई है। मुझे लगता है कि RSA Encryption public key not returned from container? जैसे समान प्रश्न हैं, हालांकि मुझे विश्वास है कि यह मुद्दा अलग है और कोई संतोषजनक उत्तर कभी नहीं दिया गया है।

सवाल इसलिए है कि मैं एक्सएमएल से आरएसए सार्वजनिक कुंजी कैसे आयात कर सकता हूं और मुख्य कंटेनर को एक नाम दे सकता हूं जबकि कंटेनर में केवल एक सार्वजनिक कुंजी जोड़ी मौजूद हो?

संपादित इस क्षेत्र के आसपास

इसके अलावा अनुसंधान भी जब एक्सएमएल से पूर्ण कुंजी आयात और भी झंडे की स्थापना कुंजी के निर्यात की अनुमति देने के लिए एक समस्या को दर्शाता है।

CspProviderFlags.UseArchivableKey; 

इस ध्वज सीएसपी पैरामीटर पर निर्दिष्ट किया जाता है जब प्रकार लाइन csp.FromXmlString(xmlText) पर फेंक दिया जाता है "अवैध निर्दिष्ट फ़्लैग" का एक अपवाद वस्तु;

मैं वास्तव में इसे समझा नहीं सकता। कुंजी बनाया गया था और पहले एक्सएमएल को निर्यात किया गया था, निश्चित रूप से यदि कुंजी पहले निर्यात किया गया है तो इसे आयात करना संभव है और इसे फिर से निर्यात करने की अनुमति होनी चाहिए?

मैंने इस पर बहुत सारे शोध किए हैं लेकिन इन समस्याओं में से किसी एक का जवाब नहीं देख सकता है।

मैंने PROV_RSA_FULL से PROV_RSA_AES तक csp प्रदाता प्रकार को बदलने का प्रयास किया है क्योंकि मुझे लगता है कि यह अब डिफ़ॉल्ट है और मुझे लगता है कि कुंजी मूल रूप से PROV_RSA_FULL के बजाय इसका उपयोग करके बनाई गई हो सकती है लेकिन इससे कोई फर्क नहीं पड़ता है।

उत्तर

0

कुंजी पैरामीटर आयात करते समय (या तो एक्सएमएल से या आरएसएपीएआरएमआईआर से) RSACryptoServiceProvider सार्वजनिक पैरामीटर प्रदान किए जाने पर वर्तमान कुंजी से अलग हो जाएगा; निजी पैरामीटर आयात किए जाने पर यह केवल कुंजी कंटेनर में कुंजी की सामग्री को प्रतिस्थापित करता है।

http://referencesource.microsoft.com/#mscorlib/system/security/cryptography/rsacryptoserviceprovider.cs,b027f6909aa0a6d1

ImportCspBlob एक अलग रास्ता ले जाता है, लेकिन अंत में ही निष्कर्ष हिट: अगर एक सार्वजनिक केवल ब्लॉब आयात किया जा रहा है यह एक अल्पकालिक कुंजी के लिए अलग हो जाता है। http://referencesource.microsoft.com/#mscorlib/system/security/cryptography/utils.cs,754f1f4055bba611

ऐसा लगता है कि अंतर्निहित विंडोज क्रिप्टोग्राफी एपीआई सार्वजनिक कुंजी के भंडारण की अनुमति नहीं देता है (जब से वे अपनी निजी कुंजी के साथ संग्रहित होते हैं)।

सीएनजी प्रलेखन https://msdn.microsoft.com/en-us/library/windows/desktop/bb427412(v=vs.85).aspx पर कहते हैं

एक मौजूदा कुंजी युग्म बनाने के लिए BCryptExportKey के लिए, इनपुट कुंजी ब्लॉब एक ​​निजी कुंजी शामिल होना चाहिए। सार्वजनिक कुंजी जारी नहीं हैं।

कोई मानता है कि उनका मतलब बीसीआरप्ट इंपोर्टकी है, लेकिन "सार्वजनिक कुंजी जारी नहीं हैं" आधिकारिक लगता है।

सीएपीआई के लिए मुझे कुछ भी सरल नहीं मिल रहा है।

सबसे अच्छा है कि मैं पा सकते हैं 'कुंजी कंटेनर' (https://msdn.microsoft.com/en-us/library/windows/desktop/ms721590(v=vs.85).aspx#_security_key_container_gly) की CAPI परिभाषा है:

कुंजी कंटेनर

कि सभी प्रमुख जोड़े शामिल कुंजी डेटाबेस का एक हिस्सा (एक्सचेंज और हस्ताक्षर कुंजी जोड़े) एक विशिष्ट उपयोगकर्ता से संबंधित है। प्रत्येक कंटेनर का एक अनूठा नाम होता है जिसका उपयोग कंटेनर को हैंडल प्राप्त करने के लिए CryptAququireContext फ़ंक्शन को कॉल करते समय किया जाता है।

यह परिभाषा केवल "कुंजी जोड़े" का संदर्भ देती है, जो बताती है कि "सार्वजनिक कुंजी" भंडारण परत द्वारा अस्वीकार कर सकती है। RSACryptoServiceProvider व्यवहार को देखते हुए, यह काफी संभावना है।

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