Как мне сделать необработанные биты sha256 в Python?

h = '''0011001010000101011111010000101111111111101000001001000001001010110100010101111001001011000100111100011110001001111011110111011010010100110011001110111001100010111011010010101101010011110100100110101111110001100101011001000110100010000110110001100101110001'''

a = binascii.hexlify(hashlib.sha256(bytes(h,'utf-8')).digest()).decode()

>>> a
44f6dafa3d7a1720b5ebbf2adc1663df4dab03776eed48d2cda775237a547e59

Итак, у меня есть строка, представляющая некоторые двоичные данные. После написания кода выше я понял, что этот метод выводит sha256 ascii строки. Вместо этого я хочу, чтобы он выводил sha256 необработанных битов, подобных:

$ echo 0011001010000101011111010000101111111111101000001001000001001010110100010101111001001011000100111100011110001001111011110111011010010100110011001110111001100010111011010010101101010011110100100110101111110001100101011001000110100010000110110001100101110001 | shasum -a 256 -0

Так что sha256 должен быть

>>> a
f3f06d74b794b20645460aa0b17d4e7a77eaaea283ee55344adbfcece4a63432

Каждый способ, который я пробовал, дает мне ошибки, и я не могу найти ответ в Интернете.

Кто-нибудь знает, как это делается?


person Alfie Stoppani    schedule 30.01.2021    source источник


Ответы (1)


import binascii
import hashlib
s = '''0011001010000101011111010000101111111111101000001001000001001010110100010101111001001011000100111100011110001001111011110111011010010100110011001110111001100010111011010010101101010011110100100110101111110001100101011001000110100010000110110001100101110001'''
h=int(s, 2).to_bytes((len(s) + 7) // 8, byteorder='big')
a = binascii.hexlify(hashlib.sha256(h).digest()).decode()

Выход:

'f3f06d74b794b20645460aa0b17d4e7a77eaaea283ee55344adbfcece4a63432'

[int.to_bytes] 2 Возвращает массив байтов, представляющий целое число. Если byteorder равен "big", старший байт находится в начале массива байтов. Если byteorder равен "little", старший байт находится в конце массива байтов.

hash.digest () и hash.hexdigest() похожи, за исключением дайджест возвращается как строковый объект двойной длины, содержащий только шестнадцатеричные цифры в последнем случае

person Ajay    schedule 30.01.2021
comment
Отлично, большое спасибо. - person Alfie Stoppani; 30.01.2021