解密文件时索引超出范围

Ort*_*und 6 security encryption filestream rijndaelmanaged

我真的不确定这里发生了什么.我的应用程序正确加密文件,没有问题,但在尝试解密同一文件时抛出了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
Run Code Online (Sandbox Code Playgroud)

该错误出现在该Stream.Close()行上.
我在其他地方应用了相同的代码,它没有任何问题......

这是我的堆栈跟踪:

捕获到System.IndexOutOfRangeException消息="索引超出了数组的范围."
Source ="mscorlib"StackTrace:在System.Security.Cryptography的System.Security.Cryptography.RijndaelManagedTransform.DecryptData(Byte [] inputBuffer,Int32 inputOffset,Int32 inputCount,Byte []&outputBuffer,Int32 outputOffset,PaddingMode paddingMode,Boolean fLast) .RijndaelManagedTransform.TransformFinalBlock(Byte [] inputBuffer,Int32 inputOffset,Int32 inputCount)在System.Security.Cryptography.CryptoStream.FlushFinalBlock()处于System.Security.Cryptography.CryptoStream.Dispose(布局处理)System.IO.Stream.Close ()在D:\ Development\Projects\Web\WebSite1\App_Code\Crypt.vb中的Crypt.EncryptDecrypt(String Action,String InFile,String OutFile):第34行InnerException:

任何帮助将不胜感激.

编辑1 在aaz的评论之后,我修改并替换了

Stream = New CryptoStream(FSOut, Rij.CreateDecryptor(Key, IV), CryptoStreamMode.Write)
Run Code Online (Sandbox Code Playgroud)

Stream = New CryptoStream(FSIn, Rij.CreateDecryptor(Key, IV), CryptoStreamMode.Write)
Run Code Online (Sandbox Code Playgroud)

这是最终的堆栈跟踪:

捕获到System.IndexOutOfRangeException消息="索引超出了数组的范围." Source ="mscorlib"StackTrace:在System.Security的System.Security.Cryptography.RijndaelManagedTransform.DecryptData(Byte []> inputBuffer,Int32 inputOffset,Int32 inputCount,Byte []&outputBuffer,Int32> outputOffset,PaddingMode paddingMode,Boolean fLast) .Cryptography.RijndaelManagedTransform.TransformFinalBlock(Byte []> inputBuffer,Int32 inputOffset,Int32 inputCount)在System.Security.Cryptography.CryptoStream.FlushFinalBlock()处于System.Security.Cryptography.CryptoStream.Dispose(布局处理)的System.IO处.在Crypt.EncryptDecrypt(String Action,String InFile,String OutFile)中的Stream.Close()> D:\ Development\Projects\Web\WebSite1\App_Code\Crypt.vb:第34行InnerException:

在我看来,它的错误相同......

结束编辑1

Gen*_*ent 1

嗯,我认为有一些事情需要解决。首先,既然您已将 FSOut 更改为 FSIn,则 FSOut 似乎从未实际使用过。您似乎正在使用其中之一,但从代码的结构来看,我认为您的意图是获取一个文件并将数据加密或解密到另一个文件。

如果您的意图是从一个文件中读取,请考虑使用http://msdn.microsoft.com/en-us/library/system.security.cryptography.rijndael.aspx作为起点从头开始并写入另一个文件,根据您的需要修改它,或者考虑使用一个辅助方法,在内存中创建文件的副本,加密文件,移动它并将内存中的文件替换到起始位置,这样做可以让您对于任何一种情况都可以利用此代码,并且不会产生太多额外的开销。