Заполнение недействительно и не может быть удалено. Заполнение нулями работает, но ANSIX923, ISO10126 или PKCS7 - нет. - PullRequest
0 голосов
/ 26 мая 2020

Изменить: Вот. NET сценарий проблемы

В настоящее время я пытаюсь написать процесс, который шифрует файлы, отправленные как потоки байтов. Библиотека AES, похоже, неправильно применяет отступы.

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

... 50 57 243226 18 0 0 0 0 0 0 0 0 0 ... ( около 30000 нулей, добавленных в конец)

Когда я думаю, я должен получать байты шифрования, подобные этому (с использованием PKCS7):

... 50 57 243226 18 9 9 9 9 9 9 9 9 9

Как мне распознать фактический метод заполнения и вернуть заполнение, как в PKCS7?

    Public Function Encrypt(InputStream As Stream) As Byte()

        Dim outputStream = New MemoryStream()

        Dim EncryptionKey As String = "MAKV2SPBNI99212"
        Using encryptor As Aes = Aes.Create()

            Dim pdb As New Rfc2898DeriveBytes(EncryptionKey, New Byte() {&H49, &H76, &H61, &H6E, &H20, &H4D, &H65, &H64, &H76, &H65, &H64, &H65, &H76})
            encryptor.Key = pdb.GetBytes(32)
            encryptor.IV = pdb.GetBytes(16)
            Using cs As New CryptoStream(outputStream, encryptor.CreateEncryptor(), CryptoStreamMode.Write)
                Dim data As Integer
                While (Assign(data, InputStream.ReadByte())) <> -1
                    cs.WriteByte(CByte(data))
                End While
            End Using
        End Using

        Return outputStream.GetBuffer()
    End Function

    Public Function Decrypt(InputStream As Stream) As Byte()

        Dim outputStream = New MemoryStream()

        Dim EncryptionKey As String = "MAKV2SPBNI99212"
        Using encryptor As Aes = Aes.Create()

            Dim pdb As New Rfc2898DeriveBytes(EncryptionKey, New Byte() {&H49, &H76, &H61, &H6E, &H20, &H4D, &H65, &H64, &H76, &H65, &H64, &H65, &H76})
            encryptor.Key = pdb.GetBytes(32)
            encryptor.IV = pdb.GetBytes(16)
            Using cs As New CryptoStream(InputStream, encryptor.CreateDecryptor(), CryptoStreamMode.Read)
                Dim data As Integer
                While (Assign(data, cs.ReadByte())) <> -1
                    outputStream.WriteByte(CByte(data))
                End While
            End Using
        End Using

        Return outputStream.GetBuffer
    End Function

    Private Function Assign(Of T)(ByRef source As T, ByVal value As T) As T
        source = value
        Return value
    End Function

1 Ответ

0 голосов
/ 28 мая 2020

Вы не должны использовать метод .GetBuffer для возвращаемых MemoryStreams. .GetBuffer возвращает базовый массив, который обычно больше, чем объем данных в Stream. Вот почему вы видите лишние 0 в конце и почему заполнение не читается должным образом. См. Раздел примечаний в документации по методу MemoryStream.GetBuffer

Вместо этого вы должны вызвать outputStream.ToArray, который вернет массив байтов, содержащий только соответствующие данные, содержащиеся в Поток без всех завершающих нулей.

...