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

使用PyCryptodome解密AES/GCM加密数据的问题排查

解决AES-GCM解密的UnicodeDecodeError问题

先看你代码里的几个核心问题:

  • 变量名笔误:ciphertext未定义,应该用你解码后的base64_encrypted_value
  • AES-GCM模式本身不需要手动处理Padding,导入的pad/unpad完全无用,可以删除
  • GCM是带认证的加密模式,加密结果包含密文+认证标签,直接用decrypt()会把标签也当成密文解密,导致输出字节不是有效UTF-8,触发解码错误

修正后的完整代码如下:

from Crypto.Cipher import AES
import codecs
import base64

# 替换为你的实际加密数据
test_encrypted_value = 'SUXiDF6Dgtc8y3eY8Euqi/IYbSlQquLJAUKmZw=='
aes_iv = 'lMF2Jrruo9rR57Uy'
aes_key = '4E645267556B586E3272357538782F41'

# 1. 128位HEX密钥转字节
byte_key = codecs.decode(aes_key, 'hex_codec')
# 2. Base64格式的IV转字节(GCM推荐IV长度12字节,解码后正好符合)
iv_bytes = base64.b64decode(aes_iv)
# 3. 拆分密文和认证标签:GCM默认标签长度16字节,从加密数据末尾截取
encrypted_bytes = base64.b64decode(test_encrypted_value)
ciphertext = encrypted_bytes[:-16]
tag = encrypted_bytes[-16:]

# 4. 初始化GCM密码器,解密并验证标签(确保数据未被篡改)
cipher = AES.new(byte_key, AES.MODE_GCM, nonce=iv_bytes)
plaintext = cipher.decrypt_and_verify(ciphertext, tag)

# 输出解密结果(预期为158100)
print(plaintext.decode('utf-8'))

关键说明

Snaplogic的Encrypt Field用AES/GCM加密时,会把密文和16字节的认证标签拼接在一起,再做Base64编码输出到ciphertext字段。你之前没拆分标签,直接解密整个字节流,导致解密结果里混入了标签的乱码字节,自然无法解码成UTF-8。用decrypt_and_verify()既能正确解密,还能验证数据完整性,避免解密被篡改过的数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 04:40:35