2012-03-11 25 views
7

İlk olarak, sadece akademik amaç için aşağıdaki kodu yazdım. Bunun sebebi, bunu bir üretim ortamına koymamam ve bunun için ihtiyacım olan şeylerin bir kısmını "bypass" etmesiydi, sadece bir dizeyi kullanarak şifrelemek/şifresini çözmem gerekiyor. aşağıdaki kod. Bunu bir kaç kez yapabildim, ancak bir nedenden dolayı "CryptographicException Bad Data" almaya başladım ve sorunun neden olabileceğinden emin değilim."Hatalı Veriler" CryptographicException

private string RSAEncrypt(string value) 
    { 
     byte[] encryptedData = Encoding.Unicode.GetBytes(value); 

     CspParameters cspParams = new CspParameters(); 
     cspParams.KeyContainerName = _rsaContainerName; 
     using (RSACryptoServiceProvider RSA = new RSACryptoServiceProvider(2048,cspParams)) 
     { 
      encryptedData = RSA.Encrypt(encryptedData, false); 
      return Convert.ToBase64String(encryptedData); 

     } 

    } 



    private string RSADecrypt(string value) 
    { 

     byte[] encryptedData = Encoding.Unicode.GetBytes(value); 

     CspParameters cspParams = new CspParameters(); 
     cspParams.KeyContainerName = _rsaContainerName; 
     using (RSACryptoServiceProvider RSA = new RSACryptoServiceProvider(2048,cspParams)) 
     { 
      encryptedData = RSA.Decrypt(encryptedData,false); 
      return Convert.ToBase64String(encryptedData); 

     } 
    } 

Bu istisnayı yalnızca RSADecrypt çağrısı üzerine atar.

Herhangi bir fikrin var mı? RSA.Decrypt'a iletilen şifrelenmiş bir dosyanın beklenen büyüklüğü ile ilgili bir şeyler okumuştum.

Teşekkür }

+0

Ah, nasıl yöntem arasındaki tuşları geçiyoruz? –

cevap

13
  • bir dizge kodlaması kullanılarak ileri ve geri düz metin dönüştürme (yani Encoding.Unicode).

  • Şifrelenmiş veriyi Base-64 kullanarak ileri geri dönüştürme (örn. Convert.[To/From]Base64String); Bunun gibi

:

private string RSAEncrypt(string value) 
{ 
    byte[] plaintext = Encoding.Unicode.GetBytes(value); 

    CspParameters cspParams = new CspParameters(); 
    cspParams.KeyContainerName = _rsaContainerName; 
    using (RSACryptoServiceProvider RSA = new RSACryptoServiceProvider(2048,cspParams)) 
    { 
     byte[] encryptedData = RSA.Encrypt(plaintext, false); 
     return Convert.ToBase64String(encryptedData); 
    } 
} 

private string RSADecrypt(string value) 
{ 
    byte[] encryptedData = Convert.FromBase64String(value); 

    CspParameters cspParams = new CspParameters(); 
    cspParams.KeyContainerName = _rsaContainerName; 
    using (RSACryptoServiceProvider RSA = new RSACryptoServiceProvider(2048,cspParams)) 
    { 
     byte[] decryptedData = RSA.Decrypt(encryptedData,false); 
     return Encoding.Unicode.GetString(decryptedData); 
    } 
} 
6

http://blogs.msdn.com/b/shawnfa/archive/2005/11/10/491431.aspx

String Kodlama Via değil Gidiş-dönüş Şifrelenmiş Do

sık yapılan bir hata yönetilen şifreleme sınıfları kullanırken insanlar saklamak girişiminde yani yapmak Kodlama sınıflarından birini kullanarak bir dizede bir şifreleme işleminin sonucu. 'un anlamı doğru görünüyor mu? Sonuçta, Encoding.ToString() bir bayt [] alır ve tam olarak ne oldukları olduğu bir dizeye dönüştürür.

... Eğer bir dizeye şifreli dönüştürmek Base64 kodlamayı kullanmak istiyorum Yerine eğer

.

... taban 64 kodlaması için, her zaman çalışır kod

Sonuçlar doğru herhangi bir giriş bit dizisini temsil edebilmek için garanti olup.

burada iyi doğru bir örnek vardır: http://msdn.microsoft.com/en-us/library/system.security.cryptography.rijndael.aspx

+0

ben o makaleyi gördük ama oldukça yok düzeltmedir olsun ya da ben değiştirmeniz gerekir benim kodunda neler ... noktası bu yardım edebilir? – TheJediCowboy

+0

Ama OP 'kullanır ByteConverter.GetString' değil' Encoding.ToString' –

+0

@ L.B Onun "ByteConverter" Bir UnicodeEncoding olduğunu! – matthewk

1

RSA büyük nesneleri şifrelemek için tasarlanmamıştır. İstisnalar alacaksınız, doldurma limitinin üzerinden geçiyorsunuz. Asıl sınır dolguya dayanmaktadır (false kullanılarak eski PKCS # 1 v1.5 dolgusunu kullanıyorsunuz demektir) ve ortak anahtarınızın uzunluğu (2048 bit).

Büyük bir nesneyle RSA'u kullanmanın doğru yolu, büyük nesneyi simetrik bir anahtarla şifrelemek (ör.256 bit AES gizli anahtar) ve şifrelemek için RSA kamu anahtarı ile bu küçük tuşuna basın.

Sen benim blog böyle şeyler yapmaya kodunu bulabilirsiniz.