You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP转VB.NET的AES-256-CBC解密结果不一致及填充错误问题

AES-256-CBC解密PHP转VB.NET结果不一致问题修复

问题根源

  • 密文长度不符:VB.NET端密文末尾多了16位零块,这会让解密算法错误处理额外的空块,直接导致结果偏差
  • 填充验证失败:PKCS7填充报错通常是因为密文长度不对、填充规则不匹配,或者解密后未正确处理填充字节

解决步骤

1. 清理密文末尾的空块

PHP的openssl_decrypt会自动忽略密文末尾的空块,但VB.NET不会。先检查并移除最后16字节的零值:

' 处理密文字节数组,移除末尾的16位零块
If ciphertext.Length >= 16 AndAlso ciphertext.Length Mod 16 = 0 Then
    Dim lastBlock = ciphertext.Skip(ciphertext.Length - 16).ToArray()
    If lastBlock.All(Function(b) b = 0) Then
        ciphertext = ciphertext.Take(ciphertext.Length - 16).ToArray()
    End If
End If

2. 对齐填充规则

PHP的openssl_decrypt默认用PKCS7填充,但如果加密时密文刚好是块大小整数倍且无填充,VB.NET需要手动调整:

  • 先设置PaddingMode.None解密,再手动检查并去除PKCS7填充字节(如果存在)
  • 确保密钥是32字节(AES-256要求)、IV是16字节(CBC块大小)

3. 基于Topaco建议的修正代码

以下是调整后的核心解密逻辑,解决填充问题并匹配PHP行为:

Using aes As New AesManaged()
    aes.Key = yourKeyBytes ' 必须是32字节的密钥
    aes.IV = yourIVBytes ' 必须是16字节的初始向量
    aes.Mode = CipherMode.CBC
    aes.Padding = PaddingMode.None ' 先不自动处理填充

    Dim decryptor = aes.CreateDecryptor(aes.Key, aes.IV)
    Using ms As New MemoryStream(ciphertext)
        Using cs As New CryptoStream(ms, decryptor, CryptoStreamMode.Read)
            Dim plaintextBuffer As New List(Of Byte)()
            Dim tempBuffer(1023) As Byte
            Dim bytesRead As Integer

            Do
                bytesRead = cs.Read(tempBuffer, 0, tempBuffer.Length)
                If bytesRead > 0 Then
                    plaintextBuffer.AddRange(tempBuffer.Take(bytesRead))
                End If
            Loop While bytesRead > 0

            ' 手动去除PKCS7填充(如果存在)
            If plaintextBuffer.Count > 0 Then
                Dim paddingLen = plaintextBuffer(plaintextBuffer.Count - 1)
                If paddingLen >= 1 AndAlso paddingLen <= 16 Then
                    plaintextBuffer.RemoveRange(plaintextBuffer.Count - paddingLen, paddingLen)
                End If
            End If

            ' plaintextBuffer即为最终解密的MP3字节数据
        End Using
    End Using
End Using

验证

解密后取十六进制片段对比:

  • PHP正确结果片段:fff320c4000818361800798209025d
  • 修正后的VB.NET结果应与上述片段完全一致,说明解密成功

内容的提问来源于stack exchange,提问作者Luiz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 04:02:40