Неправильная генерация CMAC от Pycryptodome

Согласно примеру, приведенному в документации 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

person NiK8    schedule 19.11.2020    source источник


Ответы (1)


Проблема в вашем коде заключается в том, что вы не обрабатываете сообщение или ключ 2b7e1516 28aed2a6 abf71588 09cf4f3c как шестнадцатеричное число, которым оно является в этом случае, но вы обрабатываете его как байты, где каждый символ хранится в его представлении ASCII, а не сохраняется как фактическое значение шестнадцатеричных символов, поэтому f хранится как двоичный 0100 0110, а не как двоичный 1111. В то время как RFC обрабатывает ввод как числа, закодированные как шестнадцатеричные символы, поэтому используйте этот код:

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

Надеюсь, это решит вашу проблему.

person Khaled    schedule 24.11.2020
comment
Спасибо за помощь. Я все еще новичок в PyCryptodome. - person NiK8; 24.11.2020