如何将一个sha256对象转换为整数并打包到python中的bytearray?

How to convert a sha256 object to integer and pack it to bytearray in python?

我想先把一个hash256对象转成一个32字节的整数,然后再打包成bytearray

>>> import hashlib
>>> hashobj = hashlib.sha256('something')
>>> val_hex = hashobj.hexdigest()
>>> print val_hex
3fc9b689459d738f8c88a3a48aa9e33542016b7a4052e001aaa536fca74813cb
>>> print len(val_hex)
64

十六进制字符串是 64 字节而不是 32 字节,这不是我想要的。

>>> val = hashobj.digest()
>>> print val
?ɶ?E?s????????5Bkz@R???6??H?
>>> print len(val)
32

这是一个 32 字节的字符串,我想将它转换为 32 字节的整数。

当我尝试时它给了我一个错误信息:

>>> val_int = int(val, 10)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 10: '?\xc9\xb6\x89E\x9ds\x8f\x8c\x88\xa3\xa4\x8a\xa9\xe35B\x01kz@R\xe0\x01\xaa\xa56\xfc\xa7H\x13\xcb'

我应该怎么做才能得到我的 int_val?

我如何使用结构将它(32 字节)打包成字节数组?我发现 python struct 文档中最长的格式是 'Q',它只有 8 个字节。

非常感谢。

bytearray 的要点不是将整个内容放入单个单元格中。这就是单元格只有 1 个字节大的原因。

.digest() returns一个字节串,所以你可以立即使用它:

>>> import hashlib
>>> hashobj = hashlib.sha256('something')
>>> val = hashobj.digest()
>>> print bytearray(val)
?ɶ�E�s������5Bkz@R���6��H�
>>> print repr(bytearray(val))
bytearray(b'?\xc9\xb6\x89E\x9ds\x8f\x8c\x88\xa3\xa4\x8a\xa9\xe35B\x01kz@R\xe0\x01\xaa\xa56\xfc\xa7H\x13\xcb')

Python2 中获取 SHA-256 摘要整数值的最简单方法是通过 hexdigest。或者,您可以遍历从二进制摘要构造的 bytearray。两种方法如下所示。

import hashlib

hashobj = hashlib.sha256('something')
val_hex = hashobj.hexdigest()
print val_hex

# Build bytearray from binary digest
val_bytes = bytearray(hashobj.digest())
print ''.join(['%02x' % byte for byte in val_bytes])

# Get integer value of digest from the hexdigest
val_int = int(val_hex, 16)
print '%064x' % val_int

# Get integer value of digest from the bytearray
n = 0
for byte in val_bytes:
    n = n<<8 | byte
print '%064x' % n

输出

3fc9b689459d738f8c88a3a48aa9e33542016b7a4052e001aaa536fca74813cb
3fc9b689459d738f8c88a3a48aa9e33542016b7a4052e001aaa536fca74813cb
3fc9b689459d738f8c88a3a48aa9e33542016b7a4052e001aaa536fca74813cb
3fc9b689459d738f8c88a3a48aa9e33542016b7a4052e001aaa536fca74813cb

在Python3中,我们不能向hashlib哈希函数传递一个纯文本字符串,必须传递一个bytes字符串或者一个bytearray,例如

b'something' 

'something'.encode('utf-8')

bytearray('something', 'utf-8')

我们可以将第二个版本简化为

'something'.encode()

因为 UTF-8 是 str.encode(和 bytes.decode())的默认编码。

要执行到 int 的转换,可以使用上述任何技术,但我们还有一个额外的选择:int.from_bytes 方法。为了获得正确的整数,我们需要告诉它将字节解释为大端数字:

import hashlib

hashobj = hashlib.sha256(b'something')
val = int.from_bytes(hashobj.digest(), 'big')
print('%064x' % val)

输出

3fc9b689459d738f8c88a3a48aa9e33542016b7a4052e001aaa536fca74813cb

我是这样做的

import hashlib

x = 'input'
hash = int.from_bytes(hashlib.sha256(x.encode('utf-8')).digest(), 'big')
print(my_hash)

# 91106456816457796232999629894661022820411437165637657988648530670402435361824

让我们检查散列的大小

print(len("{0:b}".format(my_hash)))

# 256

完美!