Распаковка результата palemd160 в python - PullRequest
1 голос
/ 13 марта 2019

Я работаю над программой, которая выполняет много хэширования, и на одном из этапов я беру результат хеша hasmlib maturemd160 и преобразую его в целое число.Строки:

ripe_fruit = new('ripemd160', sha256(key.to_der()).digest())
key_hash160 = struct.unpack("<Q", ripe_fruit.digest())[0]

Это дает мне ошибку:

struct.error: unpack requires a buffer of 8 bytes

Я пытался изменить значение на L и другие вещи, но они не работали.Как мне это исправить?

1 Ответ

0 голосов
/ 13 марта 2019

RIPEMD-160 возвращает 160 бит или 20 байтов.struct не знает, как распаковать целые числа больше 8 байт.У вас есть два варианта, и правильный зависит от того, что именно вы пытаетесь сделать.

  1. Если ваш алгоритм ищет только некоторые байты хэша, вы можете взятьпервые или последние 8 байтов и распакуйте их.

    key_hash160 = struct.unpack("<Q", ripe_fruit.digest()[:8])[0]
    
  2. Если вам нужно целое число в 160 байтов, сначала вы должны решить, как оно будет представлено.Является ли это прямым или старшим или что-то среднее?Затем вы можете разбить массив на 20 байтов, а затем вычислить одно число из них.Если предположить, что в вашем вопросе используется <, то вы можете сделать что-то вроде:

    key_parts = struct.unpack("B" * 20, ripe_fruit.digest())
    key_hash160 = 0
    for b in key_parts[::-1]:
      key_hash160 <<= 8
      key_hash160 |= b
    
...