Ошибка расшифровки Rijndael — недопустимая длина данных для расшифровки

Я могу зашифровать zip-файл с помощью rijndeal, но когда я расшифровываю, я получаю сообщение об ошибке «Длина данных для расшифровки недействительна». Я получаю массив байтов для расшифровки из файла. Вот как я получаю массив байтов.

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)

Как только я передаю массив байтов в метод расшифровки, я получаю сообщение об ошибке при попытке чтения с помощью криптопотока.

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

person Thomas    schedule 09.09.2009    source источник
comment
Вы имеете в виду Рейндаля? Это нормальное имя...   -  person Jonathan Leffler    schedule 09.09.2009
comment
Можете ли вы включить код, который шифрует zip-файл?   -  person russau    schedule 09.09.2009


Ответы (3)


Замените код файлового потока на System.IO.File.ReadAllBytes, System.IO.File.WriteAllBytes. Если это работает, вы знаете, что файловый поток вызывает проблему.

person russau    schedule 09.09.2009
comment
Это помогло. Как только я использовал Writeallbytes и readallbytes, все заработало нормально. Любая идея, почему? - person Thomas; 09.09.2009
comment
Возможно ли, что вы где-то передаете неправильную переменную длины? - person russau; 10.09.2009

Как вы сохраняете зашифрованные данные? Вы кодируете его с помощью простого текста (например, ASCIi, UTF-8 и т. д.) или кодируете его чем-то вроде Base-64? Попробуйте зашифровать его в массив байтов, а затем сразу же расшифровать. Если он работает и успешно расшифровывается, у вас проблема с кодировкой.

person Community    schedule 09.09.2009
comment
Я кодирую его в массив байтов, а затем записываю в файл с помощью файлового потока. - person Thomas; 09.09.2009

Это исправило это:

    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
person Thomas    schedule 02.11.2009
comment
Возможно, это решило вашу проблему, но пустой блок catch может создавать только новые. - person Nikola Malešević; 08.02.2012