2011-01-11 3 views
9

Ich spiele mit RSA-Verschlüsselung/Entschlüsselung und Zertifikate. Hier speziell, ich versuche mit dem öffentlichen Schlüssel eines Zertifikats zu verschlüsseln, und dann, wenn sie mit dem privaten Schlüssel zu entschlüsseln versuchen, dieses Zertifikat entspricht, erhalten eine Fehlermeldung:"System.Security.Cryptography.CryptographicException: Bad Key." für 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) 

-Code ist:

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!"); 
    } 
} 

Als Referenz wurde Zertifikat erstellt und installiert durch

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

Kann jemand vor Ort, was ich falsch mache? Danke im Voraus!

+0

Randnotiz: Sie sollten wirklich fOAEP = True verwenden. – CodesInChaos

Antwort

7

Ok, gefunden, was das Problem ist: benötigt makecert sagen 1), dass das Zertifikat des Subjektes Schlüsselart für „Exchange“ ist 2) private Schlüssel als exportierbar

so makecert Anruf markieren sieht aus wie

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

Hinzufügen von "-sky Exchange" zu makecert.exe Kommandozeile Anruf löste mein Problem. Dies markiert den Schlüssel, so dass er auch für die Verschlüsselung/Entschlüsselung verwendet werden kann. – Roboblob