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

