2016-08-15 3 views
1

Я использую класс microsoft RSACryptoServiceProvider для шифрования/расшифровки данных. Однако функция дешифрования генерирует исключение «Плохие данные». Это что-то о создании нового экземпляра класса провайдера каждый раз, когда я использую шифрование/дешифрование?C# Rsa Decryption throws исключение «Bad Data»

RSA Provider Класс

static public byte[] RSAEncrypt(byte[] byteEncrypt, RSAParameters RSAInfo, bool isOAEP) 
    { 
     try 
     { 
      using (RSACryptoServiceProvider RSA = new RSACryptoServiceProvider()) 
      { 
       RSA.ImportParameters(RSAInfo); 

       //Encrypt the passed byte array and specify OAEP padding. 
       return RSA.Encrypt(byteEncrypt, isOAEP); 
      } 
     } 
     catch (CryptographicException e) 
     { 
      Console.WriteLine(e.Message); 
      return null; 
     } 
    } 

    static public byte[] RSADecrypt(byte[] byteDecrypt, RSAParameters RSAInfo, bool isOAEP) 
    { 
     try 
     { 
      using (RSACryptoServiceProvider RSA = new RSACryptoServiceProvider(4096)) 
      { 
       //Import the RSA Key information. This needs 
       //to include the private key information. 
       RSA.ImportParameters(RSAInfo); 

       //Decrypt the passed byte array and specify OAEP padding. 
       return RSA.Decrypt(byteDecrypt, isOAEP); 
      } 
     } 
     catch (CryptographicException e) 
     { 
      Console.WriteLine(e.ToString()); 
      return null; 
     } 
    } 
} 

Использование

UnicodeEncoding ByteConverter = new UnicodeEncoding(); 
    RSACryptoServiceProvider RSA = new RSACryptoServiceProvider(4096); 
    byte[] plainPassword; 
    byte[] encryptedPassword; 

    plainPassword = ByteConverter.GetBytes(connectionStringPasswordTextBox.Text); 
    encryptedPassword = CryptoHelper.RSAEncrypt(plainPassword, RSA.ExportParameters(false), false); 
    RSACryptoServiceProvider RSA = new RSACryptoServiceProvider(4096); 
    byte[] decryptedPassword = CryptoHelper.RSADecrypt(Convert.FromBase64String(connectionString.password), RSA.ExportParameters(true), false); 

EDIT

Исключение было изменено на "неправильный параметр" после отказа несколько больше попробовать , Я думаю, что это связано с созданием только одного экземпляра для класса rsa для создания нового каждый раз, когда я его использую.

+0

Вы проверили это: http://stackoverflow.com/questions/9659898/bad -data-CryptographicException? –

+1

Да, я был так в отчаянии, что даже посмотрел 2-ю страницу Google. – Miral

+0

Интересно, проблема связана с созданием нового набора ключей при создании второго RSACryptoServiceProvider. Однако упоминается «ключ по умолчанию» в MSDN (https://msdn.microsoft.com/en-us/library/zseyf239(v=vs.110).aspx), но нет документации о том, что это на самом деле означает. –

ответ

1

Конструктор RSACryptoServiceProvider (int) генерирует новый ключ (если CAPI не возвращает ключ для нулевого имени, что я не уверен в возможности). Таким образом, этот код шифруется одним ключом и пытается расшифровать его с помощью другого. Полученный ответ не имеет особого смысла, что исключение вызывается.

  • Создайте свой ключ один раз и сохраните его RSAP-параметры.
  • Чтобы сделать ваш код более портативным, не говорите «RSACryptoServiceProvider»; просто поговорите о RSA, когда это возможно.
    • К сожалению, создание ключа - это время, когда это невозможно, поскольку RSACryptoServiceProvider не генерирует новый ключ при изменении KeySize.

Таким образом, вы действительно должны использовать что-то больше, как это на .NET 4.6 или выше:

public static byte[] RSAEncrypt(
    byte[] byteEncrypt, 
    RSAParameters rsaInfo, 
    RSAEncryptionPadding padding) 
{ 
    try 
    { 
     using (RSA rsa = RSA.Create()) 
     { 
      rsa.ImportParameters(rsaInfo); 
      return rsa.Encrypt(byteEncrypt, padding); 
     } 
    } 
    catch (CryptographicException e) 
    { 
     Console.WriteLine(e.Message); 
     return null; 
    } 
} 
+0

В нем говорится, что «Метод не поддерживается» для метода шифрования или дешифрования. – Miral

+0

Вы вызываете Encrypt (byte [], RSAEncryptionPadding) или EncryptValue (byte [])? Последний действительно бросает исключение NotSupportedException. Если вы не видите тот, который принимает RSAEncryptionPadding, вы, вероятно, настроите на .NET 4.5.2 или ниже (это новое в 4.6). См. Https://msdn.microsoft.com/en-us/library/system.security.cryptography.rsa.encrypt(v=vs.110).aspx и https://msdn.microsoft.com/en-us/ library/system.security.cryptography.rsa.encryptvalue (v = vs.110) .aspx – bartonjs

+0

Это не позволяет мне вызвать метод Encrypt, и когда я вызываю метод EncryptValue, он выдает NotSupportedException – Miral

Смежные вопросы