का उपयोग कर X.50 9 प्रमाणपत्र में सी # को प्रमाणित करने के लिए कैसे मैं सी # और .NetCF का उपयोग कर X.509 प्रमाण पत्र को सत्यापित करने का प्रयास कर रहा हूं। मेरे पास सीए प्रमाण पत्र है, और यदि मैं सही ढंग से समझता हूं, तो मुझे अविश्वसनीय प्रमाणपत्र के हस्ताक्षर को डिक्रिप्ट करने के लिए इस CA प्रमाणपत्र से सार्वजनिक कुंजी का उपयोग करने की आवश्यकता है। यह मुझे अविश्वसनीय प्रमाणपत्र के गणना वाले हैश मान देना चाहिए। मुझे तब प्रमाण पत्र के हैश की गणना करनी चाहिए और सुनिश्चित करना चाहिए कि दो मान मेल खाते हैं।कॉम्पैक्ट फ्रेमवर्क
मैं कुछ दिनों से इसके साथ खेल रहा हूं और मुझे बहुत दूर नहीं मिल रहा है। मैं X509 प्रमाण पत्र और RSACryptoServiceProvider कक्षाओं का उपयोग कर रहा हूं। सबसे पहले, मैंने X509 प्रमाण पत्र कक्षा से सार्वजनिक कुंजी और हस्ताक्षर प्राप्त करने का प्रयास किया। मैं सार्वजनिक कुंजी प्राप्त करने में सक्षम था लेकिन हस्ताक्षर नहीं। इसके बाद, मैंने प्रमाण पत्र बनाने वाले बाइनरी डेटा को पार्स करने का प्रयास किया, जिसने मुझे हस्ताक्षर (और कोई अन्य डेटा जो मैं चाहता था) प्राप्त करने की अनुमति दी, लेकिन मैं RSACryptoServiceProvider का उपयोग करके हस्ताक्षर को डिक्रिप्ट करने में असमर्थ था। मैं इस तरह की बातें की कोशिश की लेकिन हो रही अपवाद कहा, "बुरा कुंजी" जब मैं डिक्रिप्ट करने के लिए करने की कोशिश की रखा:
RSAParameters rsaParams = new RSAParameters();
rsaParams.Exponent = exp;
rsaParams.Modulus = mod;
RSACryptoServiceProvider rsaServ = new RSACryptoServiceProvider();
rsaServ.ImportParameters(rsaParams);
byte[] decryptedSig = rsaServ.Decrypt(encryptedSig, false);
किसी भी सलाह बहुत सराहना की जाएगी।
संपादित करें: मैंने कुछ ऐसा करने की कोशिश की जो बेहतर प्रतीत होता है लेकिन एक अजीब परिणाम लौटा रहा है। मैं X509Certificate2 कक्षा के साथ यहां काम कर रहा हूं क्योंकि यह परीक्षण के लिए थोड़ा आसान है, लेकिन बाद में मुझे .NETCF के लिए X509 प्रमाणपत्र में स्विच करने की आवश्यकता होगी। मुझे लगता है कि RSACryptoServiceProvider.VerifyData मुझे जो चाहिए वह हो सकता है। मैंने निम्नलिखित कोड की कोशिश की।
X509Certificate2 cert = new X509Certificate2(certBytes);
X509Certificate2 certCA1 = new X509Certificate2(@"C:\certs\certCA1.cer");
byte[] encryptedSig = new byte[256];
Array.Copy(certBytes, certBytes.Length - 256, encryptedSig, 0, 256);
RSACryptoServiceProvider rsa = (RSACryptoServiceProvider)certA1.PublicKey.Key;
bool good = rsa.VerifyData(cert.RawData, "1.3.14.3.2.26", encryptedSig);
जैसा कि मैंने कहा, मैं मैन्युअल रूप से डिकोड और प्रमाण पत्र की बाइनरी डेटा की व्याख्या करने में सक्षम हूँ, तो मैं यकीन है कि cert.RawData प्रमाण पत्र के हस्ताक्षर किए डेटा और पिछले 256 बाइट्स एन्क्रिप्टेड हस्ताक्षर कर रहे हैं हूँ । स्ट्रिंग हैश एल्गोरिदम का ओआईडी है, जो मुझे प्रमाणपत्र से मिला है, लेकिन मुझे 100% यकीन नहीं है कि यह सही है। VerifyData झूठी रिटर्न देता है, लेकिन मुझे यकीन नहीं है कि अभी तक क्यों।
विचार?
विनसी की सीमाएं किसी न किसी हो सकती हैं और मैं X.50 9 पर पूरी तरह से नया हूं, इसलिए मैं वास्तव में इसे सामान्य Win32 वातावरण में पहले काम करने की कोशिश कर रहा हूं और मैं ऐसा करने में भी असमर्थ हूं। मैंने सीएलआर सुरक्षा पुस्तकालय पर एक नज़र डाली जिस पर आपने इंगित किया था, लेकिन मैंने X509 प्रमाण पत्र को सत्यापित करने के लिए वहां कुछ भी नहीं देखा। क्या आप मुझे जाने के लिए थोड़ा और दे सकते हैं? – Ben
मैंने नमूना कोड के साथ उत्तर अद्यतन किया। – dthorpe
X509Certificate2 .NetCF पर उपलब्ध नहीं है, लेकिन यह सहायक है। धन्यवाद। – Ben