.NET AES Padding Проблема - PullRequest
       17

.NET AES Padding Проблема

1 голос
/ 29 января 2011

У меня сейчас проблема с заполнением при расшифровке строки в кодировке utf8.

длина строки не кратна 16, я использую режим заполнения PKCS7

Конечно, я использую *Оператор 1005 *

cs.FlushFinalBlock()

.

Что означает, что после дешифрования поток не будет удерживать последний блок.но когда не используется режим заполнения, только во время дешифрования, там последний блок (с байтами заполнения)

я понятия не имею, что не так; *

здесь немного кода (vb.net im sry:D)

шифрование

            Dim rawPlaintext As Byte() = utf8.GetBytes(text)
            aes.Padding = PaddingMode.PKCS7
            Using ms As New MemoryStream()
                Using cs As New CryptoStream(ms, aes.CreateEncryptor(), CryptoStreamMode.Write)
                    cs.Write(rawPlaintext, 0, rawPlaintext.Length)
                    cs.FlushFinalBlock()
                    ms.Position = 0
                End Using
                Return ms
            End Using

дешифрование

        aes.Padding = PaddingMode.PKCS7

        Using ms As New MemoryStream()
            Using cs As New CryptoStream(ms, aes.CreateDecryptor(key, iv),

CryptoStreamMode.Write)

                ciphertext.CopyTo(cs)
                ciphertext.Close()
                ms.Position = 0
            End Using
            Return ms            
        End Using

надеюсь, ребята, вы можете помочь;)

спасибо

1 Ответ

2 голосов
/ 29 января 2011

Я вижу две проблемы с вашим кодом: первая, вероятно, незначительная: я не думаю, что это хорошая практика - обойти удаленный MemoryStream - не возвращайте MemoryStream, возвращайте только содержащийся массив (используйте ms.ToArray ()).

Второе хуже: вам не нужно явно вызывать cs.FlushFinalBlock (), он вызывается автоматически при Dispose (при выходе из блока Using объекта CryptoStream).Однако во втором случае вы не вызываете его, и , вы сбрасываете позицию выходного потока, пока дешифрование CryptoStream еще не завершено.Это означает, что только после изменения позиции потока CryptoStream начинает очищать последний блок.Вы можете обойти это, добавив cs.FlushFinalBlock () перед ms.Position = 0 в коде расшифровки.

Но, IMHO, просто полностью удалите поиск потока (возможно, с FlushFinalBlock в коде шифрования), и вытоже должно быть хорошо.

...