2012-03-23 15 views
6

की आपूर्ति करके आरएसए एन्क्रिप्शन मैं एक सी # विनफॉर्म एप्लिकेशन बना रहा हूं जो HTTPS पर सर्वर पर डेटा पोस्ट करता है।मॉड्यूलस और एक्सपोनेंट

लॉगिन तंत्र इस तरह माना जाता है:

  1. मैं सर्वर से उपयोगकर्ता नाम भेजने के लिए, यह आरएसए-मापांक और आरएसए-प्रतिपादक के साथ प्रतिक्रिया

  2. मैं इन का उपयोग कर पासवर्ड एन्क्रिप्ट दिए गए मापदंडों और प्रमाणीकरण

मैं RSACryptoServiceProvider वर्ग की कोशिश की है के लिए सर्वर के लिए उपयोगकर्ता नाम + पासवर्ड भेजने, लेकिन मैं फाई नहीं कर सकते हैं एनडी नमूने या कुछ भी पर कहा गया है कि हम किसी दिए गए मॉड्यूलस और एक्सपोनेंट का उपयोग करके एन्क्रिप्शन कैसे कर सकते हैं?

मुझे लगता है कि कोई भी मान निर्दिष्ट किए बिना, अपने कर डिफ़ॉल्ट एन्क्रिप्शन मानकों ..

किसी को भी यह किया है तो अगर पहले, वे मुझे कुछ संकेत दे सकते हैं, कृपया? धन्यवाद

अद्यतन: श्री कार्स्टन Konig द्वारा सुझाव के अनुसार,। मैंने इसे RSAParameters और RSA.ImportParameters के साथ करने का प्रयास किया है, लेकिन यह क्रिप्टोग्राफिक अपवाद के साथ "बादा डेटा" त्रुटि देता है। मेरा कोड नीचे दिया गया है।

मैंने RSA.FromXmlString(mykey) भी कोशिश की है; (जहां mykey में मॉड्यूलस और एक्सप के साथ एक एक्सएमएल स्ट्रिंग है) लेकिन मुझे क्रिप्टोग्राफिक अपवाद के साथ "बादा डेटा" त्रुटि भी मिलती है ... किसी को भी कोई विचार है? या अगर यह कुछ माइक्रोसॉफ्ट बग है, तो क्या कोई आसानी से ऐसा करने के लिए किसी अन्य सभ्य पुस्तकालय का सुझाव दे सकता है?

RSAParameters rsaparam = new RSAParameters(); 
rsaparam.Modulus = modbytes; 
rsaparam.Exponent = expbytes; 
RSACryptoServiceProvider RSA = new RSACryptoServiceProvider() ; 
RSA.ImportParameters(rsaparam); 
byte[] encryptedData = RSA.Encrypt(dataToEncrypt, false) 

उत्तर

6

आप RSACryptoServiceProvider.Encrypt विधि का उपयोग कर ऐसा कर सकते हैं। आपको RSACryptoServiceProvider.ImportParameters विधि का उपयोग करने की आवश्यकता होगी और इसे RSAParameters संरचना (यह वह जगह है जहां आप एक्सपोनेंट, मॉड्यूलस इत्यादि सेट करते हैं) को पास करने की आवश्यकता होगी।

कृपया आरएसएपीएआरएमिटर के लिंक में प्रलेखन पर एक नज़र डालें - यह बहुत अच्छी तरह से प्रलेखित है कि आपको किस संरचना-क्षेत्र के लिए पास करना है - यदि अब आप एल्गोरिदम हैं तो कोई समस्या नहीं होनी चाहिए।

संपादित करें: यहाँ सीधे MSDN-site से उदाहरण है:

class RSACSPSample 
{ 

    static void Main() 
    { 
     try 
     {  //initialze the byte arrays to the public key information. 
      byte[] PublicKey = {214,46,220,83,160,73,40,39,201,155,19,202,3,11,191,178,56, 
            74,90,36,248,103,18,144,170,163,145,87,54,61,34,220,222, 
            207,137,149,173,14,92,120,206,222,158,28,40,24,30,16,175, 
            108,128,35,230,118,40,121,113,125,216,130,11,24,90,48,194, 
            240,105,44,76,34,57,249,228,125,80,38,9,136,29,117,207,139, 
            168,181,85,137,126,10,126,242,120,247,121,8,100,12,201,171, 
            38,226,193,180,190,117,177,87,143,242,213,11,44,180,113,93, 
            106,99,179,68,175,211,164,116,64,148,226,254,172,147}; 

      byte[] Exponent = {1,0,1}; 

      //Values to store encrypted symmetric keys. 
      byte[] EncryptedSymmetricKey; 
      byte[] EncryptedSymmetricIV; 

      //Create a new instance of RSACryptoServiceProvider. 
      RSACryptoServiceProvider RSA = new RSACryptoServiceProvider(); 

      //Create a new instance of RSAParameters. 
      RSAParameters RSAKeyInfo = new RSAParameters(); 

      //Set RSAKeyInfo to the public key values. 
      RSAKeyInfo.Modulus = PublicKey; 
      RSAKeyInfo.Exponent = Exponent; 

      //Import key parameters into RSA. 
      RSA.ImportParameters(RSAKeyInfo); 

      //Create a new instance of the RijndaelManaged class. 
      RijndaelManaged RM = new RijndaelManaged(); 

      //Encrypt the symmetric key and IV. 
      EncryptedSymmetricKey = RSA.Encrypt(RM.Key, false); 
      EncryptedSymmetricIV = RSA.Encrypt(RM.IV, false); 

      Console.WriteLine("RijndaelManaged Key and IV have been encrypted with RSACryptoServiceProvider."); 

     } 
     //Catch and display a CryptographicException 
     //to the console. 
     catch(CryptographicException e) 
     { 
      Console.WriteLine(e.Message); 
     } 
    } 
} 

कृपया ध्यान दें कि केवल कुंजी/iv एन्क्रिप्टेड हो जाता है - मनमाने ढंग से नहीं बाइट्स - उन बाइट्स की लंबाई भी महत्वपूर्ण है!

एमएसडीएन में अनुमत लंबाई का वर्णन ओएस पर निर्भर करता है!

+0

हाय, कार्स्टन König, आप जबाब .. मैं यह कोशिश की है के लिए धन्यवाद, लेकिन यह क्रिप्टोग्राफिक अपवाद .. किसी भी विचार के साथ एक "गलत डेटा" त्रुटि देता है, मैं गलत क्या कर किया जा सकता है? मैंने नीचे दिए गए कोड को जोड़ा है 'आरएसएपीएआरएमआरएस rsaparam = new rSAParameters(); rsaparam.Modulus = modbytes; rsaparam.Exponent = expbytes; RSACryptoServiceProvider आरएसए = नया RSACryptoServiceProvider(); आरएसए। आयात पैरामीटर (आरएसपीराम); बाइट [] एन्क्रिप्टेड डेटा = आरएसए। एन्क्रिप्ट (डेटा टू एन्क्रिप्टेड, झूठा); ' –

+0

मैंने आरएसए। फ्रॉमएक्सएमएलस्ट्रिंग (माईकी) भी कोशिश की है; (जहां mykey में मॉड्यूलस और एक्सप के साथ एक एक्सएमएल स्ट्रिंग है) लेकिन उसमें मुझे क्रिप्टोग्राफिक अपवाद के साथ "बादा डेटा" त्रुटि मिलती है ... कोई भी विचार किसी को भी? या अगर यह कुछ माइक्रोसॉफ्ट बग है, तो क्या कोई आसानी से ऐसा करने के लिए किसी अन्य सभ्य पुस्तकालय का सुझाव दे सकता है? –

+0

यह कहना मुश्किल है - आंतरिक अपवाद में कुछ था? हो सकता है कि आपको कुंजी-दसवीं गलती हो ... इसके बारे में सोच - क्या आप जानते हैं कि एनक्रिप्ट करने के लिए डेटा की लंबाई निश्चित लंबाई है? – Carsten

0

एक अतिरिक्त संकेत है कि मेरे लिए बहुत उपयोगी था:

इस पंक्ति में,

//Set RSAKeyInfo to the public key values. 
SAKeyInfo.Modulus = PublicKey; 

PublicKey भी हो सकता है एक सीधा, सरल, बाइट्स की सरणी है कि आप "सार्वजनिक कुंजी से प्राप्त कर सकते हैं "एक्स 50 9 प्रमाणपत्र (सीधे) का क्षेत्र।

0

यदि आप RSACryptoServiceProvider का उपयोग कर रहे हैं।सर्वर को भेजे गए मॉड्यूलस और एक्सपोनेंट को निर्यात करने के लिए ToXmlString, आपको Convert.FromBase64String का उपयोग करने की आवश्यकता है।

public RSAParameters SetPublicKey(string modulus, string exponent) 
    { 
     RSAParameters result = new RSAParameters(); 
     result.Modulus = Convert.FromBase64String(modulus); 
     result.Exponent = Convert.FromBase64String(exponent); 

     return result; 
    } 
संबंधित मुद्दे