2009-10-26 12 views
6

का उपयोग कर मैं मेकर्ट द्वारा उत्पन्न प्रमाणपत्र का उपयोग कर रहा हूं जिसमें निजी और सार्वजनिक कुंजी दोनों हैं। जावा पक्ष डेटा को एन्क्रिप्ट करने के लिए इस सार्वजनिक कुंजी का उपयोग करता है और .NET इसे वापस डिक्रिप्ट करता है।rsacryptoserviceprovider x509 प्रमाणपत्र C#

मैं जावा की एन्क्रिप्टेड 64 बिट एन्कोडेड स्ट्रिंग को डिक्रिप्ट करने और खराब डेटा प्राप्त करने का प्रयास कर रहा हूं।

यह देखने के लिए कि क्या सब अच्छा है। अंत में, मैंने फ्रिस्ट ने सार्वजनिक कुंजी से एन्क्रिप्ट करने की कोशिश की और फिर उसी प्रमाणपत्र का उपयोग करके निजी के साथ डिक्रिप्ट किया। मेरा कोड इस तरह दिखता है।

X509Certificate2 cert = GetCert(key, StoreName.My, StoreLocation.LocalMachine); 
RSACryptoServiceProvider provider = (RSACryptoServiceProvider)cert.PrivateKey; 

RSACryptoServiceProvider publicprovider = (RSACryptoServiceProvider)cert.PublicKey.Key; 

if (cert.HasPrivateKey) 
    MessageBox.Show("Got private key"); 

byte[] encrypted = publicprovider.Encrypt(Encoding.UTF8.GetBytes(text), false); 
byte[] decryptedBytes = provider.Decrypt(encrypted, false); 

यहां तक ​​कि मुझे त्रुटि भी मिल रही है। क्या मैं कुछ भूल रहा हूँ?

प्रमाणपत्र सार्वजनिक और निजी कुंजी दोनों के साथ मान्य दिखता है।

+0

क्या त्रुटि? और किस लाइन पर? –

+0

अपवाद: खराब डेटा .. कोई और आंतरिक अपवाद जब बाइट [] decryptedBytes = प्रदाता। डिक्रिप्ट (एन्क्रिप्टेड, झूठा); को – bkhanal

उत्तर

1

मुझे अंततः समस्या मिली। मैं इसे आरएसए क्रिप्टो कुंजी के रूप में परिभाषित करने के लिए मेकर्ट करने की कुंजी नहीं डाल रहा था।

4

निम्नलिखित कोड मेरे लिए ठीक काम करता है:

 RSACryptoServiceProvider privateKey = new RSACryptoServiceProvider(); 
     privateKey.FromXmlString("<RSAKeyValue><Modulus>wL8s+C8SnnlaaqR+VsyijmxOJOARNa4o7ZNsqfy3+9J9Ol2JNSjjMfQWoUnFtClzJBlZhU5KtuazQe8ZKXTX9YvKoJdRhlsonZkC04qiTMdO/FZIH00GrCRxeQ7XDnQnvPB9Bdsvs//7zrY3f7eLIkpIyK9cQHU+5jjJd5IT0eE=</Modulus><Exponent>AQAB</Exponent><P>83xxN7jvpg5z16pxz2tIQIdqd/EfmikR9Q2TjG2tosWkUSvtyx0xHZ9EqdTUbSGZZ+jgrabzkafYc7Mplylwew==</P><Q>yqcnYSZEXHwJvRWi2V09PNEENTozQZywcFptUUGar9TciaQvoNv3lpnfzUKNBRdhzq4lImxkamajZlTWE5buUw==</Q><DP>37HqilkbwyHwB6mOGhPkM3S1ujAK6qTk3JB2iEOTjMGrru9+7maJYz+Z47Wm3ARMXgyzrpZ9m8nqsJFfmoL11Q==</DP><DQ>v285tv8kMs2FkZYfuP/oOkwkkneBNejjj68Md2bmzlThZDCyQV2pvB1tmgPVHUsiPNCrCaKlFRISJzfa5rR8Ow==</DQ><InverseQ>fgJE2TRe/SS+YqW0/I+FtHrdfbbao0/R3pHD4r4oceZQUemlBgZ7DxOAetebHKthlOdjGkmfWYB8EU4XoWggqw==</InverseQ><D>FMLCwjy3wbAKiCANp6XFAJgz1o7365NFv0k41BpvasViTa4TgFFWH2ROJ7M9g0lPqJy+YrhrHcY9mqV5TVjTheQp0JeckrgO2B39XngPMAMMdne3rWGpf0Pfbj3FLfchMk6XYDXSZzCS2CmSeRA4aBMb+4R3YurixyJLrnGRMH0=</D></RSAKeyValue>"); 
     RSACryptoServiceProvider publicKey = new RSACryptoServiceProvider(); 
     publicKey.FromXmlString("<RSAKeyValue><Modulus>wL8s+C8SnnlaaqR+VsyijmxOJOARNa4o7ZNsqfy3+9J9Ol2JNSjjMfQWoUnFtClzJBlZhU5KtuazQe8ZKXTX9YvKoJdRhlsonZkC04qiTMdO/FZIH00GrCRxeQ7XDnQnvPB9Bdsvs//7zrY3f7eLIkpIyK9cQHU+5jjJd5IT0eE=</Modulus><Exponent>AQAB</Exponent></RSAKeyValue>"); 

     { 
      string text = "foo"; 
      byte[] encrypted = publicKey.Encrypt(Encoding.UTF8.GetBytes(text), false); 
      byte[] decryptedBytes = privateKey.Decrypt(encrypted, false); 
     } 

आप की अच्छी तरह जांच कर सकते हैं कि निर्यात निजी कुंजी cert.PrivateKey से है और सार्वजनिक कुंजी cert.PublicKey.Key से है?

+0

कहा जाता है जब प्रमाण वापस लौटाता है यह पहले से ही एएस सममित कुंजी उत्पन्न करता है। मैं कार्यान्वयन का उपयोग नहीं कर रहा हूं जहां हमें करना है, पहले सार्वजनिक निजी कुंजी बनाएं और उस पर आधारित प्रदाता उत्पन्न करें। यह मेकर्ट का उपयोग करता है। उपरोक्त कोड त्रुटि नहीं देता है, लेकिन 128 वर्ण मॉड्यूलस है ... – bkhanal

+1

"जब प्रमाण वापस लौटाता है तो यह पहले से ही एएस सममित कुंजी उत्पन्न करता है।" मैं वास्तव में समझ में नहीं आता कि इसका क्या अर्थ है। एईएस कुंजी कहाँ उत्पन्न हुई है? मैं इसे अपने कोड नमूने में कहीं भी नहीं देख सकता। –

+0

यदि आप मेकर्ट टूल के साथ प्रमाण पत्र बनाते हैं। इसमें निजी और सार्वजनिक कुंजी है। तो, आप स्टोर में जा सकते हैं निजी सार्वजनिक कुंजी प्राप्त करें। मैंने निजी और सार्वजनिक कुंजी – bkhanal

4

मैं, मुद्दा यह है कि मैं स्विच -sky signature-sky exchange के बजाय साथ प्रमाणपत्र पैदा किया गया था

यहाँ (आप हस्ताक्षर हस्ताक्षर करने और एन्क्रिप्शन/डिक्रिप्शन के लिए विदेशी मुद्रा के लिए उपयोग करें) स्व-हस्ताक्षरित प्रमाणपत्र के साथ एक ही समस्या थी

makecert -r -pe -a sha1 -n "CN=MyName" -ss my -sr CurrentUser -sky exchange 
2

मैं इस पेज को जब मैं ग # का उपयोग कर X509 प्रमाणपत्रों और आरएसए के साथ makcert उपयोग के उदाहरण खोजने की कोशिश कर रहा था भर में ठोकर खाई, और दुर्भाग्य से यह केवल समाधान का हिस्सा प्रदान की: कि काम करता है makecert करने के लिए अपने पूर्ण आदेश है। मैंने ब्लॉग बिट एंट्री में सभी बिट्स को एक साथ रखा है, जिसमें लोगों को रुचि हो सकती है, और यह यहां पाया जा सकता है: http://nick-howard.blogspot.com/2011/05/makecert-x509-certificates-and-rsa.html

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