Я действительно не понимаю, что здесь происходит. Мое приложение правильно и без проблем шифрует файлы, но выдает исключение 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 () в System.Security.Cryptography.CryptoStream.Dispose (Boolean утилизация) в System.IO.Stream.Close () в Crypt.EncryptDecrypt (String Action, String InFile, String 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