Код Python для хэширования значений байтов с помощью md5

Пожалуйста, примите этот вопрос от неопытного (и очень увлеченного) программиста, который пытается научиться:

Мне нужно рассчитать хэши md5 каждой комбинации байтов от 0x00 до 0xff. Я пытался сделать это с помощью Python, но я не уверен, как Python интерпретирует мой ввод. Как уже было сказано, мне нужно хэшировать значения байтов, а не символ «fa» или «00», а сами значения.

Вот пример одного кода, который я тестировал. Проблема в том, что выходные данные bytes.fromhex показывают некоторые шестнадцатеричные числа, представленные как ascii. Тогда я предполагаю, что хешируется ascii-представление, а не значение байта. Вторая проблема заключается в том, что я не уверен, как правильно использовать hashlib, чтобы значение байта хешировалось.

импортировать хеш-библиотеку

# Global variables


HEX_VALUES = {0:"0",1:"1",2:"2",3:"3",4:"4",5:"5",6:"6",7:"7",8:"8",9:"9",10:"a",11:"b",12:"c",13:"d",14:"e",15:"f"}


# Helper function for converting decimal number to another base.


def dec_to_base(num,base):

    exp = 0
    list1 = []
    while (num // base ** exp) > 0:
        num2 = (num // base ** exp) % base
        list1.insert(0,num2)
        exp += 1

    return list1

# Function for converting decimal to hex numbers.

def dec_to_hex(num):

    ret_val = []

    for x in dec_to_base(num,16):
        x = HEX_VALUES[x]
        ret_val.append(x)

    ret_val_str = ''.join(ret_val)
    ret_val_str_pad = ret_val_str.zfill(4)

    # Returns the hex number as a string with four zero-padding.

    return ret_val_str_pad


for i in range(1,65536):

    hex_number = bytes.fromhex(dec_to_hex(i))
    print(hex_number)

    h = hashlib.md5(hex_number)

    md5_hash = h.hexdigest()

    print(md5_hash)

    # Checks after TARGET STRING

person T-StoneLeif    schedule 26.03.2021    source источник
comment
1.) Байты входят, байты выходят. 2.) Нет числа 00, print(00) >> 0   -  person Maurice Meyer    schedule 26.03.2021
comment
Да, так что в моем случае программа должна была интерпретировать ввод как строку, если 00 производит другой хэш, чем 0?   -  person T-StoneLeif    schedule 26.03.2021
comment
Нет. Посмотрите на код. Первый аргумент hashlib.md5 — это байтовый объект. Строки — это не то же самое, что байты. См. строки и подобные байтам объекты   -  person President James K. Polk    schedule 26.03.2021
comment
Я обновил код. Не стесняйтесь взглянуть.   -  person T-StoneLeif    schedule 26.03.2021


Ответы (1)


md5 принимает байты, но не строку.

md5(b'00').hexdigest() # 'b4b147bc522828731f1a016bfa72c073'

md5('00').hexdigest() # TypeError: Unicode-objects must be encoded before hashing

Строка должна быть закодирована в байты перед передачей в md5.

md5('00'.encode()).hexdigest() # 'b4b147bc522828731f1a016bfa72c073'

'00'.encode() == b'00' # True
b'\x30\x30' == b'00' # True

В приведенном выше случае, в терминах C, вы передаете массив байтов {0x30, 0x30} в качестве аргумента. В вашем коде hex_number = bytes.fromhex(dec_to_hex(i)) возвращает размер 2 байта. В зависимости от вашей цели вы можете не получить то, что хотите.

hex_number = bytes.fromhex(dec_to_hex(1)) # b'\x00\x01'
md5(b'\x00\x01').hexdigest() # '441077cc9e57554dd476bdfb8b8b8102'
md5(b'\x01').hexdigest() # '55a54008ad1ba589aa210d2629c1df41'
person MarkSouls    schedule 29.03.2021