2012-01-12 3 views
0

Прежде чем тратить время на чтение, см. Приведенный ниже ответ. Проблема была недопустимой.Индекс находился за пределами массива. Шифрование Rijndael


Когда я пытаюсь расшифровать некоторые строки он бросает это исключение:

" at System.Security.Cryptography.RijndaelManagedTransform.DecryptData(Byte[] inputBuffer, Int32 inputOffset, Int32 inputCount, Byte[]& outputBuffer, Int32 outputOffset, PaddingMode paddingMode, Boolean fLast) 
     at System.Security.Cryptography.RijndaelManagedTransform.TransformFinalBlock(Byte[] inputBuffer, Int32 inputOffset, Int32 inputCount) 
     at System.Security.Cryptography.CryptoStream.FlushFinalBlock() 
     at System.Security.Cryptography.CryptoStream.Dispose(Boolean disposing) 
     at System.IO.Stream.Close() 
     at System.IO.Stream.Dispose() 
     at EBookReader.cryptography.DecryptString(String message, String KeyString, String IVString) in C:\\Users\\XWare\\Documents\\Visual Studio 2008\\Projects\\EBookReader\\EBookReader\\cryptography.cs:line 94" 

При отладке он бросает исключение на этой линии:

byte[] messageBytes = Convert.FromBase64String(message); 

Я думаю, что эту проблему просто появляется, когда строка для расшифровки слишком велика, потому что когда я пытаюсь зашифровать и дешифровать короткие строки типа «Привет, я X-Ware "он отлично работает

public static string DecryptString(string message, string KeyString, string IVString) 
    { 
     byte[] Key = ASCIIEncoding.UTF8.GetBytes(KeyString); 
     byte[] IV = ASCIIEncoding.UTF8.GetBytes(IVString); 

     string decrypted = null; 
     RijndaelManaged rj = new RijndaelManaged(); 
     rj.BlockSize = 256; 
     rj.Key = Key; 
     rj.IV = IV; 
     rj.Mode = CipherMode.CBC; 
     rj.Padding = PaddingMode.PKCS7; 
     try 
     { 
      MemoryStream ms = new MemoryStream(); 
      Encoding enc = new ASCIIEncoding(); 
      using (CryptoStream cs = new CryptoStream(ms, rj.CreateDecryptor(Key, IV), CryptoStreamMode.Write)) 
      { 
       byte[] messageBytes = Convert.FromBase64String(message); 
       cs.Write(messageBytes, 0, messageBytes.Length); 
       cs.FlushFinalBlock(); 
      }// This is line 94 
      byte[] encoded = ms.ToArray(); 
      decrypted = enc.GetString(encoded); 

      ms.Close(); 
     } 
     catch (Exception e) 
     { 
      Console.WriteLine("An error occurred: {0}", e.Message); 
     } 
     finally 
     { 
      rj.Clear(); 
     } 

     return decrypted; 
    } 

любые предложения?!

P.S. Я написал комментарий, чтобы показать вам строку 94 // Это строка 94

+1

Ваш ключ и IV чрезвычайно слабы. Посмотрите PasswordDeriveBytes –

+1

'ASCIIEncoding.UTF8' - это ужасный стиль. Используйте 'Encoding.UTF8'. – CodesInChaos

+1

Вы также должны следовать совету Хенка. То, как вы получаете свой ключ от пароля, плохо. Используйте класс «Rfc2898DeriveBytes» (это преемник упомянутого класса Хенк). – CodesInChaos

ответ

0

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

Thanx все

3

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

Чтобы сделать это в контексте вашего кода, просто удалите строку cs.FlushFinalBlock() ...

+0

не могли бы вы объяснить это на примере ?! –

+0

Перечитайте свой код и отредактируйте мой ответ. –

+0

Я пробовал то, что вы сказали мне, что он не работает ... исключение выбрано в строке 91 Convert.FromBase64String (message); когда я помещаю эту строку перед открытием криптостома, она выдает недопустимый символ в строке Base-64. Обратите внимание, что эта строка генерируется в PHP, но некоторые строки успешно дешифруются, а другие - нет. –

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