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
相关产品推荐
相关产品推荐

