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!
Randnotiz: Sie sollten wirklich fOAEP = True verwenden. – CodesInChaos