1

rijndeal を使用して zip ファイルを暗号化できますが、復号化すると、「復号化するデータの長さが無効です」というエラーが表示されます。ファイルから復号化するバイト配列を取得しています。バイト配列を取得する方法は次のとおりです。

Dim FStream As FileStream = File.OpenRead("<Filepath>")
EncData = New Byte(FStream.Length) {}
FStream.Read(EncData, 0, EncData.Length)
Dim DecryptedBytes As Byte() = DataVault.RijndealController.Decrypt(EncData, Password)

バイト配列を Decrypt メソッドに渡すと、暗号ストリームで読み取ろうとするとエラーが発生します。

Public Function Decrypt(ByVal Input As Byte(), ByVal Password As String) As Byte()

 Try
   Dim PasswordBytes As Byte() = Encoding.UTF8.GetBytes(Password)
   Dim initVectorBytes As Byte() = Encoding.ASCII.GetBytes("@0B4c3D4e5Y6r7H2")
   Dim SaltValue As Byte() = Encoding.UTF8.GetBytes("S@ltVa|u<")


   Dim DerivedBytes As Rfc2898DeriveBytes = New Rfc2898DeriveBytes(PasswordBytes,SaltValue, 4)
   Dim keyBytes As Byte() = DerivedBytes.GetBytes(32)

 Dim symmetricKey As RijndaelManaged
 symmetricKey = New RijndaelManaged()
 symmetricKey.Mode = CipherMode.CBC

 Dim decryptor As ICryptoTransform
 decryptor = symmetricKey.CreateDecryptor(keyBytes, initVectorBytes)

 Dim memoryStream As MemoryStream
 memoryStream = New MemoryStream(Input)

 Dim cryptoStream As CryptoStream
 cryptoStream = New CryptoStream(memoryStream, decryptor, CryptoStreamMode.Read)

 Dim plainTextBytes As Byte()
 ReDim plainTextBytes(Input.Length)


 Dim decryptedByteCount As Integer
While ((decryptedByteCount = cryptoStream.Read(plainTextBytes, 0, plainTextBytes.Length)) > 0)

 End While

memoryStream.Close()
cryptoStream.Close()

Return plainTextBytes

Catch ex As Exception
 Return Nothing
End Try

End Function

私が間違っていることは何ですか?

また、暗号化するコードは次のとおりです。

        Public Function EncryptBytes(ByVal Input As Byte(), ByVal Password As String) As Byte()

        Try
            Dim PasswordBytes As Byte() = Encoding.UTF8.GetBytes(Password)
            Dim initVectorBytes As Byte() = Encoding.ASCII.GetBytes("@0B4c3D4e5Y6r7H2")
            Dim SaltValue As Byte() = Encoding.UTF8.GetBytes("S@ltVa|u<")
            Dim InputStringBytes As Byte() = Input

            Dim DerivedBytes As Rfc2898DeriveBytes = New Rfc2898DeriveBytes(PasswordBytes, SaltValue, 4)
            Dim keyBytes As Byte() = DerivedBytes.GetBytes(32)


            Dim symmetricKey As RijndaelManaged
            symmetricKey = New RijndaelManaged
            symmetricKey.Mode = CipherMode.CBC

            Dim encryptor As ICryptoTransform
            encryptor = symmetricKey.CreateEncryptor(keyBytes, initVectorBytes)
            Dim MStream As New MemoryStream()

            Dim cryptoStream As CryptoStream
            cryptoStream = New CryptoStream(MStream, encryptor, CryptoStreamMode.Write)
            cryptoStream.Write(InputStringBytes, 0, InputStringBytes.Length)
            cryptoStream.FlushFinalBlock()

            Dim cipherBytes As Byte() = MStream.ToArray()
            MStream.Close()
            cryptoStream.Close()

            Return cipherBytes

        Catch ex As Exception

        End Try
        Return Encoding.UTF8.GetBytes("0")
    End Function
4

3 に答える 3

2

暗号化されたデータをどのように保存していますか?プレーンテキスト(ASCII、UTF-8など)を使用してエンコードしていますか、それともBase-64などでエンコードしていますか?バイト配列に暗号化してから、すぐに復号化してみてください。それが機能し、正常に復号化される場合は、エンコーディングの問題があります。

于 2009-09-09T00:23:15.003 に答える
2

ファイルストリーム コードを System.IO.File.ReadAllBytes、System.IO.File.WriteAllBytes に置き換えます。これが機能する場合、filestream が問題の原因であることがわかります。

于 2009-09-09T01:40:10.970 に答える
0

これはそれを修正しました:

    Public Function EncryptBytes(ByVal Input As Byte(), ByVal Password As String) As Byte()

        Try
            Dim PasswordBytes As Byte() = Encoding.UTF8.GetBytes(Password)
            Dim initVectorBytes As Byte() = Encoding.ASCII.GetBytes("@0B4c3D4e5Y6r7H2")
            Dim SaltValue As Byte() = Encoding.UTF8.GetBytes("S@ltVa|u<")
            Dim InputStringBytes As Byte() = Input

            Dim DerivedBytes As Rfc2898DeriveBytes = New Rfc2898DeriveBytes(PasswordBytes, SaltValue, 4)
            Dim keyBytes As Byte() = DerivedBytes.GetBytes(32)

            'Generate Rijndael Manager
            Dim symmetricKey As RijndaelManaged
            symmetricKey = New RijndaelManaged
            symmetricKey.Mode = CipherMode.CBC

            Dim encryptor As ICryptoTransform
            encryptor = symmetricKey.CreateEncryptor(keyBytes, initVectorBytes)
            Dim MStream As New MemoryStream()

            Dim cryptoStream As CryptoStream
            cryptoStream = New CryptoStream(MStream, encryptor, CryptoStreamMode.Write)
            cryptoStream.Write(InputStringBytes, 0, InputStringBytes.Length)
            cryptoStream.FlushFinalBlock()

            Dim cipherBytes As Byte() = MStream.ToArray()
            MStream.Close()
            cryptoStream.Close()

            Return cipherBytes

        Catch ex As Exception

        End Try
        Return Encoding.UTF8.GetBytes("0")
    End Function
于 2009-11-02T03:46:42.347 に答える