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

