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

