首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从密码穹顶产生的CMAC错误

从密码穹顶产生的CMAC错误
EN

Stack Overflow用户
提问于 2020-11-19 10:09:07
回答 1查看 362关注 0票数 0

根据PyCryptodome文档中给出的示例

代码语言:javascript
复制
>>> 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的测试向量是:

代码语言:javascript
复制
K              2b7e1516 28aed2a6 abf71588 09cf4f3c
M              6bc1bee2 2e409f96 e93d7e11 7393172a
AES-CMAC       070a16b4 6b4d4144 f79bdd9d d04a287c

但当我试着用同样的钥匙和信息

代码语言:javascript
复制
>>> 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()

我得到了以下输出

代码语言:javascript
复制
a3f10a99bd83f4dee4392d65ed9f76c1
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-11-24 01:54:53

代码中的问题是,您没有将消息或键2b7e1516 28aed2a6 abf71588 09cf4f3c作为十六进制数字(在本例中是这样),而是将其视为字节,其中每个字符都存储在它的ASCII表示中,而不是存储为十六进制字符的实际值,因此f被存储为二进制0100 0110而不是二进制1111。当RFC将输入作为HEX字符编码的数字处理时,请使用以下代码:

代码语言:javascript
复制
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)

的正确结果。

代码语言:javascript
复制
070a16b46b4d4144f79bdd9dd04a287c

希望这能解决你的问题。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64909470

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档