【问题标题】:Unpacking ripemd160 result in python解压ripemd160导致python
【发布时间】:2019-03-12 23:35:45
【问题描述】:

我正在开发一个执行大量散列的程序,在其中一个步骤中,我获取了 hashlib 的ripemd160 散列的结果并将其转换为整数。这些行是:

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 和其他东西,但它们不起作用。我该如何解决这个问题?

【问题讨论】:

    标签: python struct hash unpack ripemd


    【解决方案1】:

    RIPEMD-160 返回 160 位或 20 个字节。 struct 不知道如何解压大于 8 字节的整数。你有两个选择,正确的一个取决于你到底想做什么。

    1. 如果您的算法只查找散列的一些字节,您可以取出前 8 个字节或后 8 个字节并将其解包。

      key_hash160 = struct.unpack("<Q", ripe_fruit.digest()[:8])[0]
      
    2. 如果您需要一个 160 字节的整数,您首先必须决定它是如何表示的。它是小端还是大端或介于两者之间的东西?然后您可以将数组分成 20 个字节,然后从中计算一个数字。假设基于您问题中的&lt; 的小端序,您可以执行以下操作:

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

    【讨论】:

    • 效果很好。我只需要删除反向拼接。
    猜你喜欢
    • 2021-12-23
    • 1970-01-01
    • 2021-07-18
    • 2018-03-11
    • 1970-01-01
    • 2012-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多