2013-10-25 18 views
6

System.Security.Cryptograph.RSACryptoServiceProvider kullanarak karşılaştığım bir sorunu yalıtan aşağıdaki sınama sahibim. Sorun şu ki, r.Decrypt istisna atıyor "Anahtar mevcut değil". Hem şifreleme hem de şifre çözme için privateKeyXml kullanırsam (şifresini çözerken publicKeyXml kullanmak yerine) beklendiği gibi çalışır. Tabii ki özel anahtarı paylaşmak istemiyorum, ortak anahtarla şifresini çözmem gerekiyor. Burada yanlış yaptığım şeyi gören var mı?"Anahtar mevcut değil" istisnası atıldı. Neyi yanlış yapıyorum?

[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

olası yinelenen [RSACryptoServiceProvider kullanarak şifrelenmiş bir metin şifresi nasıl?] (Http://stackoverflow.com/questions/6763741/how - şifreli-şifreli-metin-kullanarak-rsacryptoserviceprovider) –

+3

Asimetrik şifrelemenin nasıl çalıştığını unutmayın: her zaman ortak anahtarla şifreleyin ve özel anahtarla şifresini çözün. –

+0

evet, bu bir dupe. teşekkürler –

cevap

1

"Özel anahtar şifreleme/ortak anahtar şifre çözme" kullanıyorsunuz. İhtiyacımız olan belirli bir bağlamın olduğu bir projede çalışıyorum. Bunun hakkında birçok tartışma olduğunu biliyorum, ama nasıl yapacağımı açıklamaya devam edeceğim. "İmzala/Doğrula" veya "ortak anahtar şifreleme/özel anahtar şifre çözme" yi ne zaman kullanmamız gerektiğini açıklayan pek çok soru olduğunu düşünüyorum.

Her şeyden önce seninle aynı çözümü aldım ama işe yaramadı, birçok CspParameters seçeneğini test ettim. Çalışması gerektiğini düşünüyorum, ama değil!

Yani, benim son çözüm BouncyCastle kütüphaneleri kullanmaktı:

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)); 
ait
İlgili konular