6

ここで何が起こっているのか本当にわかりません。私のアプリはファイルを正しく問題なく暗号化していますが、同じファイルを復号化しようとすると 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 がキャッチされました Message="インデックスが配列の範囲外でした。"
Source="mscorlib" StackTrace: 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) System.Security.Cryptography.CryptoStream.FlushFinalBlock() で System.Security.Cryptography.CryptoStream.Dispose(Boolean disposing) で System.IO.Stream.Close () Crypt.EncryptDecrypt (文字列アクション、文字列 InFile、文字列 OutFile) で D:\Development\Projects\Web\WebSite1\App_Code\Crypt.vb:line 34 InnerException:

どんな助けでも大歓迎です。

EDIT 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="インデックスが配列の範囲外でした。" Source="mscorlib" StackTrace: 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) で System.Security.Cryptography.CryptoStream.FlushFinalBlock() で System.Security.Cryptography.CryptoStream.Dispose(Boolean disposing) で System.IO. Crypt.EncryptDecrypt(文字列アクション、文字列 InFile、文字列 OutFile) での Stream.Close() > D:

私には同じエラーのようです...

編集終了 1

4

2 に答える 2

1

さて、修正する必要があることがいくつかあると思います。1 つには、FSOut を FSIn に変更したため、FSOut が実際に使用されているようには見えません。あなたはどちらか一方を使用しているようですが、コードの構造から、あなたの意図はファイルを取り込んでデータを別のファイルに暗号化または復号化することだったと思います。

http://msdn.microsoft.com/en-us/library/system.security.cryptography.rijndael.aspxを出発点として使用し、1 つのファイルから読み取ることを意図している場合は、これを最初から開始することを検討してください。別のファイルに書き込み、必要に応じて変更するか、メモリ内にファイルのコピーを作成し、ファイルを暗号化し、それを移動し、メモリ内のファイルを開始位置に置き換えるヘルパー メソッドを使用することを検討してください。どちらの場合でもこのコードを利用して、余分なオーバーヘッドが実際に発生することはありません。

于 2011-02-17T00:17:26.940 に答える
0

CryptoStreamデータの末尾に PKCS#7 スタイルのパディングを出力します。これには、1 バイトから 1 つの完全な暗号ブロックまでの任意の場所を含めることができますが、長さが 0 になることはありません。これにより、暗号化されたストリームの長さがブロック サイズの倍数であり、パディングを明確に削除できることが保証されます。有効な暗号化されたデータではないものを解読しようとしている可能性はありますか?

于 2011-02-17T00:41:28.293 に答える