2011-01-11 25 views
9

Estoy jugando con el cifrado/descifrado RSA y los certificados. Aquí específicamente, trato de cifrar con la clave pública de un certificado, y luego, cuando se trata de descifrar con la clave privada correspondiente a este certificado, aparece un error:"System.Security.Cryptography.CryptographicException: Bad Key". para 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) 

Código es:

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

Como referencia, certificado fue creado e instalado a través

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

puede alguien manchar lo que estoy haciendo mal? ¡Gracias por adelantado!

+0

Nota al margen: Realmente debería usar fOAEP = verdadero. – CodesInChaos

Respuesta

7

Ok, conocer cuál es el problema: tenía que decirle makecert 1), que es el tipo de clave objeto del certificado es de "Cambio" 2) para marcar la clave privada como exportable

llamada para makecert parece

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

agregando "-sky Exchange" a la llamada de línea de comandos makecert.exe resolvió mi problema. Esto marca la clave para que también se pueda usar para el cifrado/descifrado. – Roboblob