我试图从旧版HMAC-SHA-512
和pycrypto
构建hashlib
。结果与RFC4231
到目前为止我的代码:
from hashlib import sha512 # my pycrypto doesn't have SHA
from Crypto.Hash import HMAC
from binascii import a2b_hex
# helper to match HMAC signature
class Sha512:
@staticmethod
def new():
return sha512()
def hmac(hexkey, hexdata):
return HMAC.new(a2b_hex(hexkey), a2b_hex(hexdata), digestmod=Sha512).hexdigest()
hmac("0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b", "4869205468657265")
'9656975ee5de55e75f2976ecce9a04501060b9dc22a6eda2eaef638966280182477fe09f080b2bf564649cad42af8607a2bd8d02979df3a980f15e2326a0a22a'
# should be
'87aa7cdea5ef619d4ff0b4241a1d6cb02379f4e2ce4ec2787ad0b30545e17cdedaa833b7d6b8a702038b274eaea3f4e4be9d914eeb61f1702e696c203a126854'
我在某处出错了吗?
key
中的pycrypto
可能有不同的语义吗?
编辑:我在Python3中也看到了与最新的pycrypto相同的差异。
答案 0 :(得分:1)
事实证明,pycrypto
想要在实例化算法之前看到算法的块和摘要大小。
这是一个有效的黑客:
class Test:
@staticmethod
def new():
return sha512()
block_size = sha512().block_size
digest_size = sha512().digest_size
此外,旧版本的pycrypto不支持更大的块大小: https://bugs.launchpad.net/pycrypto/+bug/754806
此外,pycrypto
对于此特定任务并非真正必需。 Python提供了一个hmac
模块,可以快乐地接受hashlib
哈希。