Индекс находился вне границ массива. Шифрование Rijndael - PullRequest
0 голосов
/ 12 января 2012

Прежде чем тратить время на чтение этого вопроса, посмотрите ответ на свой вопрос ниже. Неправильный ввод.


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

    "   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

Ответы [ 2 ]

3 голосов
/ 12 января 2012

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

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

0 голосов
/ 14 января 2012

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

Спасибо всем

...