【问题标题】:.Net AES Padding Problem.Net AES 填充问题
【发布时间】:2011-06-17 17:37:51
【问题描述】:

我目前在解密 utf8 编码字符串时遇到了填充问题。

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

我当然会使用

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

希望你们能帮忙;)

谢谢

【问题讨论】:

    标签: .net vb.net aes padding


    【解决方案1】:

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

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

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

    【讨论】:

    • 谢谢。第一个问题:在我的完整代码中,我没有返回已处理的内存流;)我没有看到第二个问题,但现在对我来说很清楚。干得好,现在可以了。
    猜你喜欢
    • 1970-01-01
    • 2010-09-25
    • 2021-01-14
    • 2016-09-03
    • 1970-01-01
    • 2023-03-29
    • 2017-10-21
    • 2011-03-28
    相关资源
    最近更新 更多