Распаковка результата palemd160 в python

Я работаю над программой, которая выполняет много хэширования, и на одном из шагов я беру результат хеша 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 ответ

Решение

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
    
Другие вопросы по тегам