解密文件时索引超出范围

时间:2011-02-16 22:16:48

标签: 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

错误出现在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(布尔值   处置)          在System.IO.Stream.Close()          在Crypt.EncryptDecrypt(String Action,String InFile,String OutFile)   在   d:\开发\项目\网络\的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 个答案:

答案 0 :(得分:1)

我认为有一些事情需要修复。对于一个现在看来,FSOut实际上并没有将FSOut改为FSIn。您似乎正在使用其中一个但是从代码结构中我认为您的意图是将文件加入并加密或解密到另一个文件。

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

答案 1 :(得分:0)

CryptoStream在数据末尾发出PKCS#7样式的填充,可能包括从一个字节到一个完整密码块的任何地方,但绝不是零长度;这确保加密流的长度是块大小的倍数,并且可以明确地移除填充。您是否有可能尝试解密无效加密数据的内容?