2015-06-18 3 views
0

, когда я использую этот код для шифрования и дешифрования я получил ошибка сказалаПеретяжка является недействительной и не может быть удалена с Rijndael

Перетяжка является недействительной и не может быть удалена.

любая идея

public static class Crypto 
{ 

    private static readonly byte[] initVectorBytes = Encoding.ASCII.GetBytes("tu89geji340t89u2"); 

    // This constant is used to determine the keysize of the encryption algorithm. 
    private const int keysize = 256; 

    public static string Encrypt(string plainText, string passPhrase) 
    { 
     byte[] plainTextBytes = Encoding.UTF8.GetBytes(plainText); 
     using (PasswordDeriveBytes password = new PasswordDeriveBytes(passPhrase, null)) 
     { 
      byte[] keyBytes = password.GetBytes(keysize/8); 
      using (RijndaelManaged symmetricKey = new RijndaelManaged()) 
      { 
       symmetricKey.Mode = CipherMode.CBC; 
       using (ICryptoTransform encryptor = symmetricKey.CreateEncryptor(keyBytes, initVectorBytes)) 
       { 
        using (MemoryStream memoryStream = new MemoryStream()) 
        { 
         using (CryptoStream cryptoStream = new CryptoStream(memoryStream, encryptor, CryptoStreamMode.Write)) 
         { 
          cryptoStream.Write(plainTextBytes, 0, plainTextBytes.Length); 
          cryptoStream.FlushFinalBlock(); 
          byte[] cipherTextBytes = memoryStream.ToArray(); 
          return Convert.ToBase64String(cipherTextBytes); 
         } 
        } 
       } 
      } 
     } 
    } 

    public static string Decrypt(string cipherText, string passPhrase) 
    { 
     byte[] cipherTextBytes = Convert.FromBase64String(cipherText); 
     using (PasswordDeriveBytes password = new PasswordDeriveBytes(passPhrase, null)) 
     { 
      byte[] keyBytes = password.GetBytes(keysize/8); 
      using (RijndaelManaged symmetricKey = new RijndaelManaged()) 
      { 
       symmetricKey.Mode = CipherMode.CBC; 
       using (ICryptoTransform decryptor = symmetricKey.CreateDecryptor(keyBytes, initVectorBytes)) 
       { 
        using (MemoryStream memoryStream = new MemoryStream(cipherTextBytes)) 
        { 
         using (CryptoStream cryptoStream = new CryptoStream(memoryStream, decryptor, CryptoStreamMode.Read)) 
         { 
          byte[] plainTextBytes = new byte[cipherTextBytes.Length]; 
          int decryptedByteCount = cryptoStream.Read(plainTextBytes, 0, plainTextBytes.Length); 
          return Encoding.UTF8.GetString(plainTextBytes, 0, decryptedByteCount); 
         } 
        } 
       } 
      } 
     } 
    } 
} 
+0

Вы посмотрели на это: http://stackoverflow.com/questions/23406135/error-rijndaelmanaged-padding-is-invalid-and-cannot-be-removed – PaulF

+0

Да и это не сработало – tito11

+0

Как долго данные, которые вы шифруете/дешифруете? – PaulF

ответ

1

Я попытался следующие, используя свои методы, и она работала хорошо:

var passPhrase = "123456"; 
var e = Encrypt("testtesttesttest", passPhrase); 
Console.WriteLine(e); // YEtSJshcn686ZO+JlEQ48ap/odhuvIGalbAT1XhinqQ= 
var d = Decrypt(e, passPhrase); 
Console.WriteLine(d); // testtesttesttest 

Это говорит о том, что вы либо проходя различные passPhrase в Decrypt() к одному переданному до Encrypt(), или что вы каким-то образом развращаете зашифрованный текст перед расшифровкой. (Вы, возможно, вызывая Decrypt с параметрами зашифрованного и PassPhrase обратными?)

Стоит также отметить, что в основном все в комментариях в верхней части кода не так:

  • Вы не пропуская любую соль до PasswordDeriveBytes.
  • Размер IV должен быть равен размеру блока (16 байтов), он не связан с используемым размером ключа.
  • Передача строки из 16 символов через Encoding.ASCII.GetBytes() приводит к выходу 16 байт, не 32 байта. (Это скорее совпадение означает, что ваш initVectorBytes на самом деле является правильной длиной для IV).

Кроме того, PasswordDeriveBytes устарел и не должен использоваться. Вместо этого вы должны использовать Rfc2898DeriveBytes, и вы должны использовать правильное значение соли. IV также не должен быть статическим значением, и определенно не один, полученный из строки ASCII!

+0

Извините, что я удаляю старый метод, не снимая комментария – tito11

+0

@ tito11 Вы посмотрели остальную часть ответа? Я не мог воспроизвести описанную вами ошибку, предполагая, что проблема заключается в коде, который вы * не указали *. Я предлагаю отредактировать ваш вопрос, чтобы показать, как вы используете эти методы, и на самом деле будет отображаться ошибка, если она будет удалена в Visual Studio и запущена. (См .: http://sscce.org/) – Iridium