Индекс вне диапазона при расшифровке файла - PullRequest
6 голосов
/ 17 февраля 2011

Я действительно не уверен, что здесь происходит. Мое приложение шифрует файлы правильно и без проблем, но выдает исключение IndexOutOfRangeException при попытке расшифровать тот же файл ...

Вот мой код:

Public Sub EncryptDecrypt(ByVal Action As String, ByVal InFile As String, ByVal OutFile As String)
    Try
        Dim Buffer(4096) As Byte
        Dim Stream As CryptoStream
        Dim Rij As New System.Security.Cryptography.RijndaelManaged
        Dim Key(), IV() As Byte

        FSIn = New FileStream(InFile, FileMode.Open, FileAccess.Read)
        FSOut = New FileStream(OutFile, FileMode.OpenOrCreate, FileAccess.Write)
        FSOut.SetLength(0)

        Key = CreateKey("p0Ju423KQY7h4D29Ml536jbX7gS2Q6Rtm87XvRttlKiZ")
        IV = CreateIV("p0Ju423KQY7h4D29Ml536jbX7gS2Q6Rtm87XvRttlKiZ")

        If Action = "E" Then
            Stream = New CryptoStream(FSOut, Rij.CreateEncryptor(Key, IV), CryptoStreamMode.Write)
        Else
            Stream = New CryptoStream(FSOut, Rij.CreateDecryptor(Key, IV), CryptoStreamMode.Write)
        End If

        Stream.Close()
        FSIn.Close()
        FSOut.Close()
    Catch ex As Exception
        MsgBox(ex.ToString)
    End Try
End Sub

Ошибка появляется в строке Stream.Close().
Я применил тот же код в другом месте, и у него нет проблем ...

Вот мой след стека:

System.IndexOutOfRangeException было поймано сообщение = "Индекс был снаружи границы массива. "
Source = "mscorlib" StackTrace: в System.Security.Cryptography.RijndaelManagedTransform.DecryptData (Byte [] inputBuffer, Int32 inputOffset, Int32 inputCount, Byte [] & outputBuffer, Int32 outputOffset, PaddingMode paddingMode, Boolean fLast) в System.Security.Cryptography.RijndaelManagedTransform.TransformFinalBlock (Byte [] inputBuffer, Int32 inputOffset, Int32 inputCount) в System.Security.Cryptography.CryptoStream.FlushFinalBlock () at System.Security.Cryptography.CryptoStream.Dispose (Boolean утилизации) в System.IO.Stream.Close () at Crypt.EncryptDecrypt (строковое действие, строковый InFile, строковый OutFile) в D: \ Development \ Projects \ Web \ WEBSITE1 \ App_Code \ Crypt.vb: линия 34 InnerException:

Любая помощь будет принята с благодарностью.

РЕДАКТИРОВАТЬ 1 После комментария aaz я пересмотрел и заменил

Stream = New CryptoStream(FSOut, Rij.CreateDecryptor(Key, IV), CryptoStreamMode.Write)

с

Stream = New CryptoStream(FSIn, Rij.CreateDecryptor(Key, IV), CryptoStreamMode.Write)

Вот итоговый след стека:

System.IndexOutOfRangeException было обнаружено Message = "Индекс находился за пределами массива." Источник = "mscorlib" Трассировки стека: в System.Security.Cryptography.RijndaelManagedTransform.DecryptData (Byte []> inputBuffer, Int32 inputOffset, Int32 inputCount, Byte [] & outputBuffer, Int32> outputOffset, PaddingMode paddingMode, Boolean fLast) в System.Security.Cryptography.RijndaelManagedTransform.TransformFinalBlock (Byte []> inputBuffer, Int32 inputOffset, Int32 inputCount) в System.Security.Cryptography.CryptoStream.FlushFinalBlock () в System.Security.Cryptography.CryptoStream.Dispose (логическое удаление) в System.IO.Stream.Close () в Crypt.EncryptDecrypt (String Action, String InFile, String OutFile) в> D: \ Development \ Projects \ Web \ WebSite1 \ App_Code \ Crypt.vb: строка 34 InnerException:

Мне кажется, что это та же ошибка ...

КОНЕЦ РЕДАКТИРОВАНИЯ 1

Ответы [ 2 ]

1 голос
/ 17 февраля 2011

Ну, я думаю, есть пара вещей, которые нужно исправить.Для одного Не похоже, что FSOut когда-либо фактически использовался теперь, когда вы изменили FSOut на FSIn.Вы, кажется, используете один или другой, но из структуры кода я бы подумал, что вы намеревались взять файл In и зашифровать или расшифровать данные в другой файл.

Подумайте об этом с нуля.используя http://msdn.microsoft.com/en-us/library/system.security.cryptography.rijndael.aspx в качестве отправной точки, и если вы хотите, чтобы он читал из одного файла и записывал в другой, измените его, как считаете нужным, или рассмотрите возможность использования вспомогательного метода, который создает копию файла в памяти,зашифровывает файл, перемещает его и заменяет файл в памяти в исходное местоположение, делая это таким образом, что позволяет использовать этот код в любом случае и не требует больших дополнительных затрат.

0 голосов
/ 17 февраля 2011

CryptoStream испускает заполнение в стиле PKCS # 7 в конце данных, которое может включать в себя от одного байта до одного полного блока шифра, но никогда не бывает нулевой длины;это гарантирует, что зашифрованный поток будет кратным размеру блока по длине, и что заполнение может быть однозначно удалено.Возможно, вы пытаетесь расшифровать что-то, что не является действительными зашифрованными данными?

...