2011-01-11 23 views
9

RSA şifreleme/şifre çözme ve sertifikalarla oynuyorum. İşte özellikle, bir sertifikanın ortak anahtar ile şifrelemek deneyin ve bu sertifikaya karşılık gelen özel anahtarı ile deşifre çalışırken, daha sonra, bir hata alıyorum:"System.Security.Cryptography.CryptographicException: Kötü Anahtar." 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) 

Kod geçerli:

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!"); 
    } 
} 
Başvuru için

, sertifika birisi yanlış ne yapıyorum nokta Can

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

yoluyla oluşturulan ve kuruldu? Şimdiden teşekkürler!

+0

Yan not: Gerçekten fOAEP = true kullanmalısınız. – CodesInChaos

cevap

7

Tamam, sorun ne buldum: o sertifikanın konu anahtar türü ihraç

yüzden makecert araması olarak özel anahtarı görünüyor işaretlemek için "Exchange" 2) içindir var) MakeCert 1 anlatmak için gerekli

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

makecert.exe komut satırı çağrısı "-sky Exchange" ekleme benim sorunumu çözdü. Bu, şifreleme/şifre çözme için de kullanılabilmesi için anahtarı işaretler. – Roboblob