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

使用cryptography库生成AES-CMAC签名与在线计算器结果不符

问题原因

代码存在两处编码逻辑错误,导致传入CMAC算法的密钥、消息和实际运算要求的输入不匹配:

  • 密钥处理逻辑错误:cryptography库的AES接口要求传入原始二进制字节作为密钥,你对截取到的密钥片段调用binascii.hexlify(),会将原始字节转换为ASCII编码的十六进制字符串字节,不仅长度翻倍,内容也完全改变。同时你没有先将十六进制字符串格式的密钥解码为原始字节,直接截取字符串的最后16位,拿到的只是16个ASCII字符,并非真实的16字节密钥。
  • 消息处理逻辑错误:你传入的message是十六进制文本的ASCII字节表示,总长度32字节,而标准CMAC运算需要传入十六进制字符串解码后的16字节原始二进制数据,直接传入ASCII文本会导致运算内容完全错误。
修正后代码
import binascii
from cryptography.hazmat.primitives.cmac import CMAC
from cryptography.hazmat.primitives.ciphers import algorithms

# 测试参数
key = b'cce9cdc049d9b46140a850dc8c7b146c9efa60caa228c49e1eec9303bed205ba'
message = b'6ffad88b23783dc86974c75f87370dc0'

# 处理密钥:先将十六进制字符串解码为原始字节,再截取最后16字节作为AES-CMAC密钥
raw_key = binascii.unhexlify(key)[-16:]
# 处理消息:将十六进制字符串解码为原始二进制字节
raw_msg = binascii.unhexlify(message)

# 计算CMAC
cmac_obj = CMAC(algorithms.AES(raw_key))
cmac_obj.update(raw_msg)
cmac_res = cmac_obj.finalize()

print("CMAC结果:", binascii.hexlify(cmac_res))

运行上述代码得到的输出为b'dfea87c2b4c2678ab63241e552b84acd',和预期结果完全一致。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 09:51:47