重写Python中的Java Biginteger功能



我正在尝试在Python脚本中重写一些JavaCode。其中的一部分是从sha256哈希中推断出一个简单的数字。

在Java中,此功能称为:

public static Long getId(byte[] publicKey) {
    byte[] publicKeyHash = Crypto.sha256().digest(publicKey);
    BigInteger bigInteger = new BigInteger(1, new byte[] {publicKeyHash[7], publicKeyHash[6], publicKeyHash[5],
            publicKeyHash[4], publicKeyHash[3], publicKeyHash[2], publicKeyHash[1], publicKeyHash[0]});
    return bigInteger.longValue();
}

publicKey是双层的,所以我不能在这里打印,但是我用于测试的publicKeyhash是:D9D5C57971EEFB085E3ABAF7A5A4A5A4A6CDB818185F3010555555583CDB09AD858F611886EC65

我了解此Java代码的第三行将D9D5C579转换为一个数字。属于哈希的数字是4273301882745002507

现在,我正在寻找一块/python代码线来生成该哈希的相同数字。

def getId(publicKey):
 publicKeyHash = binascii.hexlify(publicKey)
 p = publicKeyHash
 return(struct.unpack("Q",struct.pack("cccccccc",p[7],p[6],p[5],p[4],p[3],p[2],p[1],p[0]))[0])

是第一次尝试,但是这显然不起作用,它确实返回一个数字,但不能返回正确的数字。这里有人熟悉两种语言并能够帮助我翻译此功能吗?

怎么样(未经测试):

import hashlib
publicKeyHash = hashlib.sha256.digest(publicKey)
bigInt = 0
for byte in publicKeyHash[:7]:
  bigInt <<= 8
  bigInt |= byte

这有效:

from hashlib import sha256
import json
import struct
import binascii
def getId(publicKey):
 publicKeyHash = sha256(publicKey)
 p = publicKeyHash.digest()
 b = bytearray(p[:8])
 b.reverse()
 bigInt = 0
 for byte in b:
  bigInt <<= 8
  bigInt |= byte  
  #print bigInt
 return(bigInt)

最新更新