【问题标题】:How to hash int/long using hashlib in Python?如何在 Python 中使用 hashlib 对 int/long 进行散列?
【发布时间】:2018-06-30 05:24:46
【问题描述】:

我正在开发一套用于教育目的的加密算法/协议。具体来说,我目前正在研究 OAEP 编码。

OAEP 涉及使用加密哈希函数;因此我想使用 Python3 标准中提供的hashlib 库。

假设我有一个 128 位整数,我想获取它的 SHA256 摘要。我怎样才能在 Python 中做到这一点?我能找到的只是如何使用hashlib.sha256() 散列字符串(或 b 字符串)。

【问题讨论】:

    标签: python hash cryptography


    【解决方案1】:

    哈希作用于 bytes,一个 0-255 范围内的整数值序列;这与实现语言无关。您必须将 128 位整数转换为代表该值的一系列字节。这就是hashlib 模块只接受bytes 对象(“b 值”)的原因。

    如何做到这一点完全取决于用例;您需要查看特定的 OAEP 标准如何指定此类整数的表示方式。

    例如,您可以采用十进制整数值的字符串表示;一系列 ASCII 数字;这不是一个非常有效的方法,因为它最多可能占用 39 个字节:

    >>> import hashlib
    >>> 2 ** 128 - 1  # largest 128-bit value
    340282366920938463463374607431768211455
    >>> len(str(2 ** 128 - 1))
    39
    >>> str(2 ** 128 - 1).encode('ASCII')  # ascii bytes
    b'340282366920938463463374607431768211455'
    >>> hashlib.sha256(str(2 ** 128 - 1).encode('ASCII')).hexdigest()
    'f315ff319bf588e202110ab686fb8c3dbca12b4df9fbd844615b566a2fff3e75'
    

    一种更有效的方法是获取这 128 位,将它们分成 16 个字节并散列它们。然后你需要决定byte order (little or big endian)。如果您需要散列多个整数值,那么 Python struct module 可以帮助生成字节,但仅适用于最多 8 个字节的整数值(您必须先拆分较大的数字)。对于单个值,只需使用 int.to_bytes() method:

    >>> (2 ** 128 - 1).to_bytes(16, 'little', signed=False)
    b'\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff'
    >>> hashlib.sha256((2 ** 128 - 1).to_bytes(16, 'little', signed=False)).hexdigest()
    '5ac6a5945f16500911219129984ba8b387a06f24fe383ce4e81a73294065461b'
    

    【讨论】:

    • 我明白;但是,整数仍然是一系列字节。 IE。 3 = 00000011 或 16 = 00010000(或更长的整数只是更长的位序列,可以分成 8 个块)。我不明白的是,我应该如何将此整数输入 Python 的 hashlib.sha256() 实现。我不明白它期望的论点是什么。
    • @OranCanÖren:这就是我的回答试图传达给您的内容。您将数值表示为字节,具体操作方式取决于您的用例。该标准将详细说明使用什么方法。
    猜你喜欢
    • 1970-01-01
    • 2021-09-15
    • 2015-10-25
    • 1970-01-01
    • 2011-02-23
    • 1970-01-01
    • 1970-01-01
    • 2013-04-04
    • 1970-01-01
    相关资源
    最近更新 更多