2010-09-02 13 views
7

का उपयोग कर 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 झूठी रिटर्न देता है, लेकिन मुझे यकीन नहीं है कि अभी तक क्यों।

विचार?

उत्तर

3

यहाँ है मेरी कोड।

RSACryptoServiceProvider rsa = signingCertificate_GetPublicKey(); 
return rsa.VerifyData(SignedValue(), CryptoConfig.MapNameToOID("SHA1"), Signature()); 

RSACryptoServiceProvider signingCertificate_GetPublicKey() 
{ 
    RSACryptoServiceProvider publicKey = new RSACryptoServiceProvider(); 

    RSAParameters publicKeyParams = new RSAParameters(); 
    publicKeyParams.Modulus = GetPublicKeyModulus(); 
    publicKeyParams.Exponent = GetPublicKeyExponent(); 

    publicKey.ImportParameters(publicKeyParams); 

    return publicKey; 
} 

byte[] GetPublicKeyExponent() 
{ 
    // The value of the second TLV in your Public Key 
} 

byte[] GetPublicKeyModulus() 
{ 
    // The value of the first TLV in your Public Key 
} 

byte[] SignedValue() 
{ 
    // The first TLV in your Ceritificate 
} 

byte[] Signature() 
{ 
    // The value of the third TLV in your Certificate 
} 

मुझे उम्मीद है कि इस समस्या पर काम करने वाले किसी भी व्यक्ति की सहायता करें।

1

क्या WinCE Win32 MSCrypto.dll के साथ कुछ संगत समर्थन करता है? यदि हां, तो .NET X509Certificate2 कक्षा और CLR Security library on Codeplex. पर एक नज़र डालें। इसमें .NET के लिए बहुत उपयोगी दिनचर्या शामिल हैं जो कोर ओएस क्रिप्टो लाइब्रेरी के शीर्ष पर बैठती हैं। आप स्रोत डाउनलोड करने और देखें कि यह कैसे .NetCF

के लिए संकलित लोड और एक X509 प्रमाणपत्र सत्यापित करने के लिए कर सकते हैं, कुछ इस तरह (untested) कार्य करें: निर्माण करने के लिए

X509Certificate2 के लिए
var cert = new X509Certificate2("mycert.cer"); 
if (!cert.Verify()) 
{ 
    <fail> 
} 

रहे हैं लगभग एक दर्जन कंस्ट्रक्टर्स विभिन्न प्रकार के स्रोतों से - डिस्क पर फ़ाइल, मेमोरी में बाइट सरणी, स्थानीय प्रमाणपत्र स्टोर से लोड इत्यादि।

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

दुर्भाग्य से, मैं एमएसडीएन दस्तावेज़ों से नहीं बता सकता कि क्या X509Certificate2 .NetCF पर उपलब्ध है।

+0

विनसी की सीमाएं किसी न किसी हो सकती हैं और मैं X.50 9 पर पूरी तरह से नया हूं, इसलिए मैं वास्तव में इसे सामान्य Win32 वातावरण में पहले काम करने की कोशिश कर रहा हूं और मैं ऐसा करने में भी असमर्थ हूं। मैंने सीएलआर सुरक्षा पुस्तकालय पर एक नज़र डाली जिस पर आपने इंगित किया था, लेकिन मैंने X509 प्रमाण पत्र को सत्यापित करने के लिए वहां कुछ भी नहीं देखा। क्या आप मुझे जाने के लिए थोड़ा और दे सकते हैं? – Ben

+0

मैंने नमूना कोड के साथ उत्तर अद्यतन किया। – dthorpe

+0

X509Certificate2 .NetCF पर उपलब्ध नहीं है, लेकिन यह सहायक है। धन्यवाद। – Ben

0

यह Win32 में मेरे लिए काम करता है, लेकिन कम्पैक्ट फ्रेमवर्क में मैं एक ही समस्या का सामना कर रहा हूँ, वहाँ कोई X509Certificate2 है, इसलिए मैं वास्तव में अवरुद्ध कर रहा हूँ, Win32 के साथ हम कर सकते हैं:

X509Certificate2 l__PublicKeyCertificate = new X509Certificate2("cert.cer"); 

RSACryptoServiceProvider l__rsaCspPublic = (RSACryptoServiceProvider)l__PublicKeyCertificate .PublicKey.Key; 

//... 

l__isVerified = l__rsaCspPublic.VerifyData(l__fileData, CryptoConfig.MapNameToOID("SHA1"), l__fileSignature); 
+0

मैंने कुछ समय पहले यह पता लगाया और जवाब पोस्ट करना भूल गया। मैं अपने स्रोत कोड पर एक नज़र डालूंगा और उत्तर सोमवार तक पोस्ट कर दूंगा। – Ben

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