2013-10-25 8 views
6

Ich habe den folgenden Test, der ein Problem isoliert, das ich benutze, mit System.Security.Cryptograph.RSACryptoServiceProvider. Das Problem ist, dass r.Decrypt die Ausnahme "Schlüssel existiert nicht" auslöst. Wenn ich privateKeyXml sowohl für die Verschlüsselung als auch für die Entschlüsselung verwende (anstatt publicKeyXml beim Entschlüsseln zu verwenden), funktioniert es wie erwartet. Natürlich möchte ich den privaten Schlüssel nicht teilen, ich muss mit dem öffentlichen Schlüssel entschlüsseln können. Kann jemand sehen, was ich hier falsch mache?Ausnahme "Schlüssel nicht vorhanden" ausgelöst. Was mache ich falsch?

[Fact] 
    public void BasicEncryptDecrypt() 
    { 
     var cspParameters = new CspParameters() { Flags = CspProviderFlags.CreateEphemeralKey | CspProviderFlags.NoPrompt }; 

     string privateKeyXml = null; 
     string publicKeyXml = null; 

     using(var r = new RSACryptoServiceProvider(2048, cspParameters)){ 
      r.PersistKeyInCsp = false; 
      privateKeyXml = r.ToXmlString(true); 
      publicKeyXml = r.ToXmlString(false); 
     } 

     byte[] encrypted = null; 
     string decrypted = null; 

     using (var r = new RSACryptoServiceProvider(2048, cspParameters)) 
     { 
      r.FromXmlString(privateKeyXml); 
      encrypted = r.Encrypt(Encoding.UTF8.GetBytes("foobar"), false); 
     } 

     using (var r = new RSACryptoServiceProvider(2048, cspParameters)) 
     { 
      r.FromXmlString(publicKeyXml); 
      decrypted = Encoding.UTF8.GetString(r.Decrypt(encrypted, false)); 
     } 

     Assert.Equal("foobar", decrypted); 
    } 
+1

möglich Duplikat [wie einen verschlüsselten Text mit RSACryptoServiceProvider entschlüsseln?] (Http://stackoverflow.com/questions/6763741/how -zum entschlüsseln-ein-verschlüsselter-text-using-rsacrptoserviceprovider –

+3

Vergessen Sie nicht, wie asymmetrische Verschlüsselung funktioniert: Sie verschlüsseln immer mit dem öffentlichen Schlüssel und entschlüsseln mit dem privaten Schlüssel. –

+0

Ja, das ist ein Betrogener. Danke, –

Antwort

1

Sie verwenden eine "Verschlüsselung mit privatem Schlüssel/Entschlüsselung mit öffentlichem Schlüssel". Ich arbeite in einem Projekt, in dem es einen spezifischen Kontext gibt, in dem wir es tun müssen. Ich weiß, dass es viele Diskussionen darüber gibt, aber ich werde weiter erklären, wie es geht. Ich denke, es gibt viele Fragen, wo es erklärt, wann wir "sign/verify" oder "Public Key Encryption/Private Key Decryption" verwenden sollten oder nicht.

Zuerst habe ich auch die gleiche Lösung wie Sie, aber es hat nicht funktioniert, ich habe eine Menge von CspParameters Optionen getestet. Ich denke, es sollte funktionieren, aber das tut es nicht!

So, das war meine letzte Lösung die BouncyCastle Bibliotheken zu verwenden:

RsaPrivateCrtKeyParameters privateKeyParameters = (RsaPrivateCrtKeyParameters)PrivateKeyFactory.CreateKey(Convert.FromBase64String(prvKey)); 
AsymmetricKeyParameter publicKeyInfoParameters = PublicKeyFactory.CreateKey(Convert.FromBase64String(pubKey)); 
byte[] clearData = Encoding.UTF8.GetBytes("..."); 
string algorithm = "RSA/ECB/PKCS1Padding"; 

var cipherOne = Org.BouncyCastle.Security.CipherUtilities.GetCipher(algorithm); 
cipherOne.Init(true, privateKeyParameters); 
byte[] signedData = cipherOne.DoFinal(clearData); 

var clientTwo = CipherUtilities.GetCipher(algorithm); 
clientTwo.Init(false, publicKeyInfoParameters); 
var clearDataTwo = clientTwo.DoFinal(signedData); 

Assert.IsTrue(Convert.ToBase64String(clearData) == Convert.ToBase64String(clearDataTwo));