You need to enable JavaScript to run this app. Python AES ECB模式解密结果异常 老旧硬件加密适配问题求助
优惠活动
大模型
产品
解决方案
定价
更多

Python AES ECB模式解密结果异常 老旧硬件加密适配问题求助

问题核心定位

你将十六进制编码形式的密文字符串直接作为原始密文传入AES解密接口,这是解密结果完全不符合预期的根本原因。

错误逻辑拆解

  • 你第一次加密完成后调用binascii.hexlify(msg_en)的操作,本质是把长度为16字节的原始二进制密文,转换为32字节长的可读十六进制ASCII字符串:每一个原始密文字节都会被拆分为两个代表十六进制数值的可见字符,例如原始密文中的0x75字节,在hex字符串中对应的是两个独立字节——字符'7'和字符'5'。
  • 后续单独测试解密时,你直接把上述32字节的hex字符串内容b"75ce1408b210410124729691da93c439"传给解密接口,实际传入的根本不是之前生成的16字节原始密文,而是把hex字符串的每个ASCII字符都当成了密文块的组成部分。AES-128的ECB模式仅要求输入长度为16的整数倍,不会对密文内容做合法性校验,因此会直接把这32字节的字符串拆成两个16字节的错误数据块硬解,最终输出毫无关联的乱码内容。

修正方案

拿到十六进制格式的密文字符串后,先将其还原为对应的原始二进制密文,再传入解密接口即可,对应核心代码:

decipher = AES.new(key, AES.MODE_ECB)
# 把hex字符串还原为16字节原始密文
raw_cipher = binascii.unhexlify(b"75ce1408b210410124729691da93c439")
msg_dec = decipher.decrypt(raw_cipher)

按这个逻辑修改后,解密结果会和你第一次直接使用加密返回值解密的结果完全一致,也就是正确恢复出b'AAAAAAAAAAAAAAAA'的原始明文。

对接老旧硬件做适配时,这类问题非常高频:硬件输出的密文往往默认用十六进制格式做打印、串口传输,很多开发者会忘记hex本身是一层外层编码,而非密文原始内容本身。由于AES解密不会对密文的有效性做前置校验,只要输入长度符合块大小要求就会返回解密结果,没有明显的报错提示,排查时很容易卡住。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.23 23:45:10