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

Python环境下AES GCM模式解密实现及参数报错问题解决

AES-GCM解密报decrypt_and_verify()缺少received_mac_tag参数的解决方法

报错根源

加密阶段按「随机nonce + 密文 + GCM认证tag」的顺序拼接了完整加密字节流,但解密代码没有对这个拼接流做拆分,未将末尾的认证tag提取为独立变量,调用带认证校验的解密方法时自然无法传入必填参数,触发类型错误。

解密实现步骤

  • 十六进制值转原始字节:用bytes.fromhex()将存储的HexMyKey转换为AES密钥原始字节,将存储的HexEncryptedOriginalMessage转换回加密时拼接的完整原始字节流
  • 拆分拼接的加密字节流:
    • 截取现字节流前固定长度作为nonce:长度和加密时生成的随机nonce完全一致,GCM通用推荐长度为12字节
    • 截取现字节流末尾固定长度作为认证tag:长度和加密时生成的GCM tag完全一致,cryptography库默认tag长度为16字节
    • 去掉头部nonce、尾部tag后的中间段,即为实际密文内容
  • 执行解密认证:初始化AES-GCM解密实例时传入拆分得到的nonce,调用解密接口时,将密文作为待解密数据,将独立提取的tag作为received_mac_tag参数传入,即可完成解密和完整性校验。

示例可运行代码

from cryptography.hazmat.primitives.ciphers.aead import AESGCM

# 替换为你实际存储的两个十六进制字符串
HexMyKey = "你的密钥十六进制值"
HexEncryptedOriginalMessage = "你的加密内容十六进制值"

# 十六进制解码
key = bytes.fromhex(HexMyKey)
raw_blob = bytes.fromhex(HexEncryptedOriginalMessage)

# 按加密配置设置固定长度,必须和加密时完全一致
NONCE_LEN = 12
TAG_LEN = 16

# 拆分三段内容
nonce = raw_blob[:NONCE_LEN]
tag = raw_blob[-TAG_LEN:]
ciphertext = raw_blob[NONCE_LEN:-TAG_LEN]

# 解密校验
aesgcm = AESGCM(key)
try:
    plaintext = aesgcm.decrypt(
        nonce=nonce,
        data=ciphertext,
        associated_data=None,
        received_mac_tag=tag
    )
    original_content = plaintext.decode("utf-8")
    print(original_content)
except ValueError as e:
    print(f"认证校验失败,解密终止:{e}")

注意要点

  • 拆分使用的nonce长度、tag长度必须和加密配置严格匹配,否则会出现字节切割错位、认证失败
  • 若加密时配置了附加认证数据,解密时需要传入完全相同的附加数据,否则即使密钥正确、字节拆分准确也无法通过校验
  • decrypt_and_verify方法不会自动从密文流末尾识别、提取tag,必须手动拆分后作为独立参数传入

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.23 06:06:05