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

运行AES ECB解密代码报错ValueError:数据需对齐块边界求解决

问题解决思路与修正代码

错误原因

AES-ECB模式要求待解密数据的长度必须是16字节(AES固定块大小)的整数倍,你的代码触发该错误,本质是读取后的加密数据长度不符合要求,或是数据读取/处理过程中出现了损坏。


核心修复步骤

  • 用二进制模式读取加密文件:加密数据属于二进制流,文本模式读取可能因编码、换行符处理导致数据损坏,直接用rb模式读取:
    with open('file.json', 'rb') as f:
        enc_data = f.read()
    
  • 规范密钥处理:AES密钥长度必须是16、24或32字节(对应AES-128/192/256),读取密钥时要去除多余的换行、空格:
    with open('Key.txt', 'r', encoding='utf-8') as f:
        key = f.read().strip()  # 清除首尾空白字符
    key_bytes = key.encode('utf-8')
    # 提前验证密钥长度,避免后续报错
    assert len(key_bytes) in (16, 24, 32), "密钥长度必须为16/24/32字节"
    
  • 校验加密数据长度:读取后直接检查数据长度是否为16的倍数,排除数据截断或附加无关内容的情况:
    assert len(enc_data) % 16 == 0, "加密数据长度必须是16字节的整数倍"
    

完整修正代码

from Crypto.Cipher import AES

# 读取加密二进制数据
with open('file.json', 'rb') as enc_file:
    enc_data = enc_file.read()

# 读取并格式化密钥
with open('Key.txt', 'r', encoding='utf-8') as key_file:
    key = key_file.read().strip()
key_bytes = key.encode('utf-8')

# 前置校验,提前排查格式问题
assert len(key_bytes) in (16, 24, 32), "密钥长度不符合AES标准"
assert len(enc_data) % 16 == 0, "加密数据未对齐AES块边界"

# 执行解密
cipher = AES.new(key_bytes, AES.MODE_ECB)
decrypted_bin = cipher.decrypt(enc_data)

# 二进制转JSON字符串(优先UTF-8,失败则尝试Latin1)
try:
    decrypted_json = decrypted_bin.decode('utf-8')
    print(decrypted_json)
except UnicodeDecodeError:
    decrypted_json = decrypted_bin.decode('latin1')
    print(decrypted_json)

额外注意点

如果校验时发现数据长度不符合要求,大概率是文件读取方式错误,或是文件本身在传输/保存时出现了截断;在线工具能正常解密,说明原始加密数据本身是符合格式的。另外,ECB模式安全性极低,后续新的加密场景建议改用CBC/GCM等模式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 01:46:05