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

Python3实现兼容Java AES/CBC/NOPADDING的UDP报文解密问题咨询

问题根因

  • 密钥处理逻辑不匹配:Java侧直接将输入的key字符串转UTF-8字节作为AES密钥,你的Python代码额外对key做了MD5哈希运算,导致两侧密钥不一致,解密输出乱码。
  • Python的pycryptodome库原生支持AES/CBC/NOPADDING模式,无需额外配置,只要参数和Java侧对齐即可。

修正后的Python代码

from base64 import b64decode
from Crypto.Cipher import AES

class AESCipher:
    def __init__(self, key):
        # 直接取key的UTF-8字节作为密钥,和Java逻辑对齐
        self.key = key.encode('utf8')

    def decrypt(self, data):
        raw = b64decode(data)
        # IV和Java侧一致用全0的16字节
        cipher = AES.new(self.key, AES.MODE_CBC, bytes(16))
        # NOPADDING模式直接解密,不需要调用unpad
        decrypted_bytes = cipher.decrypt(raw)
        # 转成UTF-8字符串返回
        return decrypted_bytes.decode('utf8')

if __name__ == '__main__':
    key = "UfrGUmAJq86pVtkd"
    expected_result = "topotatopotatota"
    encrypted_data = "ynCF3bJejxlLn1aAk8vcAw=="
    cipher = AESCipher(key)
    decrypted_data = cipher.decrypt(encrypted_data)
    print(decrypted_data)
    # 输出:topotatopotatota,和预期一致

注意事项

  • AES/CBC/NOPADDING模式要求待加密/解密的数据长度必须是16的整数倍(AES算法的块大小),如果后续业务中有长度不足的场景,需要和Java侧对齐补全规则(比如补0、补空格等),不要用默认的PKCS7填充。
  • 你最早提供的第一段解密代码逻辑本身是正确的,报错大概率是其他参数对齐问题,上述修正后的代码已经可以完全兼容你提供的Java加密逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 22:57:03