.Net AES填充问题

时间:2011-01-29 12:25:04

标签: .net vb.net aes padding

当解密utf8编码的字符串时,我目前遇到填充问题。

字符串长度不是16的倍数,我使用PKCS7 paddingmode

当然我确实使用

cs.FlushFinalBlock()

语句。

什么是happing,在解密之后,流不会占用最后一个块。 但是当解密时只使用无填充模式时,最后一个块就在那里(带填充字节)

我不知道什么是错的;)

继承了一些代码(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 个答案:

答案 0 :(得分:2)

我可以看到你的代码有两个问题:第一个可能是次要问题:我不认为传递一个已处理的MemoryStream是一个好习惯 - 不要返回MemoryStream,只返回包含的数组(使用ms。 ToArray的())。

第二个更糟糕的是:你不需要显式地调用cs.FlushFinalBlock(),它会在Dispose上自动调用(当离开CryptoStream的Using块时)。但是,在第二种情况下,您不会调用它,重置输出流的位置,而解密CryptoStream尚未完成。这意味着只有在更改流位置后,CryptoStream才会刷新最后一个块。你可以通过在解密代码中的ms.Position = 0之前添加cs.FlushFinalBlock()来解决这个问题。

但是,恕我直言只是完全删除了流搜索(可能在加密代码中使用FlushFinalBlock),你也应该没问题。