0

根据 PyCryptodome 文档中给出的示例

>>> from Crypto.Hash import CMAC
>>> from Crypto.Cipher import AES
>>> secret = b'Sixteen byte key'
>>> cobj = CMAC.new(secret, ciphermod=AES)
>>> cobj.update(b'Hello')
>>> print cobj.hexdigest()

它生成 AES CMAC,但是当我尝试来自RFC4493的测试向量时,我得到了错误的 CMAC。例如,来自 RFC4493 的测试向量是:

K              2b7e1516 28aed2a6 abf71588 09cf4f3c
M              6bc1bee2 2e409f96 e93d7e11 7393172a
AES-CMAC       070a16b4 6b4d4144 f79bdd9d d04a287c

但是当我尝试相同的密钥和消息时

>>> from Crypto.Hash import CMAC
>>> from Crypto.Cipher import AES
>>> secret = b'2b7e151628aed2a6abf7158809cf4f3c'
>>> cobj = CMAC.new(secret, ciphermod=AES)
>>> cobj.update(b'6bc1bee2 2e409f96 e93d7e11 7393172a')
>>> print cobj.hexdigest()

我得到以下输出

a3f10a99bd83f4dee4392d65ed9f76c1
4

1 回答 1

1

您的代码中的问题是您没有将消息或密钥 2b7e1516 28aed2a6 abf71588 09cf4f3c视为十六进制数字,在这种情况下,您将其视为字节,其中每个字符都存储在它的 ASCII 表示中,而不是存储为的实际值十六进制字符因此f存储为二进制0100 0110而不是二进制1111。虽然 RFC 将输入处理为编码为 HEX 字符的数字,但请使用以下代码:

from Crypto.Hash import CMAC
from Crypto.Cipher import AES
secret = "2b7e151628aed2a6abf7158809cf4f3c"
msg = "6bc1bee22e409f96e93d7e117393172a"
cobj = CMAC.new(bytes.fromhex(secret), ciphermod=AES)
cobj.update(bytes.fromhex(msg))
res = cobj.hexdigest()
print(res)

这将打印正确的结果

070a16b46b4d4144f79bdd9dd04a287c

希望这能解决您的问题。

于 2020-11-24T01:54:53.840 回答