当解密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
感谢
答案 0 :(得分:2)
我可以看到你的代码有两个问题:第一个可能是次要问题:我不认为传递一个已处理的MemoryStream是一个好习惯 - 不要返回MemoryStream,只返回包含的数组(使用ms。 ToArray的())。
第二个更糟糕的是:你不需要显式地调用cs.FlushFinalBlock(),它会在Dispose上自动调用(当离开CryptoStream的Using块时)。但是,在第二种情况下,您不会调用它,和重置输出流的位置,而解密CryptoStream尚未完成。这意味着只有在更改流位置后,CryptoStream才会刷新最后一个块。你可以通过在解密代码中的ms.Position = 0之前添加cs.FlushFinalBlock()来解决这个问题。
但是,恕我直言只是完全删除了流搜索(可能在加密代码中使用FlushFinalBlock),你也应该没问题。