从pycrypto和hashlib构建HMAC-SHA-512

时间:2015-05-20 08:05:07

标签: python cryptography hmac pycrypto sha512

我试图从旧版HMAC-SHA-512pycrypto构建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相同的差异。

1 个答案:

答案 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哈希。