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

AES无IV解密报错:IV长度不符合要求的问题求助

AES解密问题排查与解决方案

先解决IV长度错误的问题

你碰到的ValueError: Incorrect IV length (it must be 16 bytes long)是因为AES块大小固定为16字节(128位)——不管密钥是128/192/256位,IV必须刚好16字节。朋友说取加密数据第一个块当IV的思路是对的,但你可能没正确提取:

  • 如果加密数据是Hex编码:第一个块对应32个Hex字符(1字节=2个Hex字符),得先把整个加密数据用unhexlify转成字节,再取前16字节当IV,剩下的才是真正要解密的密文主体。
  • 如果加密数据是Base64编码:先解码成字节,再切前16字节当IV,剩下的是密文。

你的几个疑问逐一解答

1. 解密后数据是UTF-8编码吗?

不一定。游戏里的配置、存档类数据常是二进制格式(比如protobuf自定义结构、固定长度字段),就算是文本也可能带不可见控制字符。解密后可以先试着转UTF-8,要是报错就存成二进制文件,用十六进制编辑器(比如010 Editor)分析结构。

2. binascii.unhexlify能用在当前场景吗?

看数据和密钥的实际编码:

  • 你的密钥是64个字符:如果是Hex编码,unhexlify后会得到32字节,正好是AES-256的密钥长度,这个假设很合理。
  • 加密数据如果是纯Hex字符(只有0-9、a-f/A-F),就用unhexlify解码;如果是Base64(含大小写字母、数字、+、/,结尾可能有=),就用base64.b64decode。你可以对比数据开头的字符特征判断。

3. 怎么确认数据和密钥的编码格式?

  • 密钥64字符:Hex转成32字节(AES-256)是游戏加密常用的标准密钥长度;如果是Base64,64字符转成48字节,这不是AES的标准密钥长度(16/24/32字节),所以你假设是Hex的概率很高。
  • 加密数据:拿开头一段字符和Hex/Base64的特征对比,或者两种解码方式都试一遍,看哪种解码后能得到16字节的IV和看起来合理的后续密文。

修正后的代码示例

假设密钥是Hex编码(64字符→32字节AES-256),加密数据也是Hex编码:

import binascii
from Crypto.Cipher import AES
from Crypto.Util.Padding import unpad

# 替换成你的实际密钥和加密数据
hex_key = "你的64字符密钥字符串"
hex_ciphertext = "你的加密数据Hex字符串"

# 解码密钥和加密数据为字节
key = binascii.unhexlify(hex_key)
cipher_data = binascii.unhexlify(hex_ciphertext)

# 拆分IV和实际密文
iv = cipher_data[:16]
actual_ciphertext = cipher_data[16:]

# 用CBC模式解密(需要IV的场景大概率是CBC)
cipher = AES.new(key, AES.MODE_CBC, iv)
plaintext = cipher.decrypt(actual_ciphertext)

# 去除PKCS7填充(游戏常用的填充方式)
try:
    plaintext = unpad(plaintext, AES.block_size)
except ValueError:
    # 可能没有填充或者用了其他填充方式,直接保留原始解密结果
    pass

# 尝试转UTF-8输出,失败则保存为二进制文件
try:
    print(plaintext.decode('utf-8'))
except UnicodeDecodeError:
    with open('decrypted_game_data.bin', 'wb') as f:
        f.write(plaintext)
    print("解密后是二进制数据,已保存到decrypted_game_data.bin")

如果加密数据是Base64,把binascii.unhexlify(hex_ciphertext)换成base64.b64decode(hex_ciphertext)就行。

额外实用提示

  • 游戏加密常用CBC或CTR模式,CBC需要填充,CTR不需要。如果unpad报错,试试换成AES.MODE_CTR模式(注意CTR的IV有时叫nonce,游戏里常和CBC一样用16字节)。
  • 解密后的二进制数据,你可以用十六进制编辑器查找和“鼠标控制”“菜单限制”相关的字段——通常这类开关是布尔值(00/01)或枚举值,找到后修改再重新加密替换回游戏文件即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 22:40:53