2011-01-11 10 views
9

के लिए मैं आरएसए एन्क्रिप्शन/डिक्रिप्शन और प्रमाणपत्र के साथ खेल रहा हूं। यहाँ विशेष रूप से, मैं एक प्रमाण पत्र की सार्वजनिक कुंजी के साथ एन्क्रिप्ट करने के लिए प्रयास करें, और तब, जब निजी कुंजी है कि प्रमाण पत्र के लिए इसी के साथ डिक्रिप्ट करने के लिए कोशिश कर रहा है, कोई त्रुटि मिलती है:"सिस्टम। सुरक्षा। क्रिप्टोग्राफी। क्रिप्टोग्राफिक अपवाद: खराब कुंजी।" RSACryptoServiceProvider.Decrypt()

System.Security.Cryptography.CryptographicException: Bad Key. 

    at System.Security.Cryptography.CryptographicException.ThrowCryptographicException(Int32 hr) 
    at System.Security.Cryptography.RSACryptoServiceProvider.DecryptKey(SafeKeyHandle pKeyContext, Byte[] pbEncryptedKey, Int3 
2 cbEncryptedKey, Boolean fOAEP, ObjectHandleOnStack ohRetDecryptedKey) 
    at System.Security.Cryptography.RSACryptoServiceProvider.Decrypt(Byte[] rgb, Boolean fOAEP) 

कोड है:

private void TestCertificates2() 
{ 
    ////////////////////////////////////////////////////// 
    // SENDER CODE 
    ////////////////////////////////////////////////////// 

    // get certificate 
    var certSender = new X509Certificate2(@"C:\Test.cer"); 

    // encrypt with public key 
    var providerSender = (RSACryptoServiceProvider)certSender.PublicKey.Key; 
    var plainSender = Encoding.Default.GetBytes("this is plain text"); 
    var cipher = providerSender.Encrypt(plainSender, false); 

    ////////////////////////////////////////////////////// 
    // RECEIVER CODE 
    ////////////////////////////////////////////////////// 

    // get certificate 
    var store = new X509Store("MY", StoreLocation.LocalMachine); 
    store.Open(OpenFlags.ReadOnly | OpenFlags.OpenExistingOnly); 
    var certReceiver = store.Certificates.Find(X509FindType.FindBySubjectName, "Test Subject", false)[0]; 

    // decrypt with private key 
    var providerReceiver = (RSACryptoServiceProvider)certReceiver.PrivateKey; 
    var plainReceiver = providerReceiver.Decrypt(cipher, false); 

    // check they are same 
    if (plainSender.Equals(plainReceiver)) 
    { 
     Console.WriteLine("Same!"); 
    } 
} 

संदर्भ के लिए, प्रमाण पत्र बनाया है और स्थापित

makecert.exe Test.cer -n "CN=Test Subject" -sr LocalMachine -ss My 

के माध्यम से किसी स्थान सकता है मैं गलत क्या कर रहा हूँ था? अग्रिम में धन्यवाद!

+0

साइड नोट: आपको वास्तव में fOAEP = true का उपयोग करना चाहिए। – CodesInChaos

उत्तर

7

ठीक है, पाया क्या मुद्दा है:) makecert 1 बताने के लिए कि प्रमाण पत्र की विषय कुंजी प्रकार निर्यात

तो makecert कॉल के रूप में निजी कुंजी लग रहा है चिह्नित करने के लिए "एक्सचेंज" 2) है जरूरत

की तरह
makecert.exe Test.cer -r -n "CN=Test Subject" -sr LocalMachine -ss My -sky Exchange -pe 
+0

मेकर्ट.एक्सई कमांड लाइन कॉल में "-स्की एक्सचेंज" जोड़कर मेरी समस्या हल हो गई। यह कुंजी कुंजी है ताकि इसे एन्क्रिप्शन/डिक्रिप्शन के लिए भी इस्तेमाल किया जा सके। – Roboblob

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