在Python中重写Java BigInteger函数
我正在尝试把一些Java代码改写成Python脚本。其中一部分是从一个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();
}
公钥是二进制格式,所以我不能在这里打印出来,但我用来测试的公钥哈希是:d9d5c57971eefb085e3abaf7a5a4a6cdb8185f30105583cdb09ad8f61886ec65
根据我的理解,这段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])
这是我第一次尝试,但显然这并不奏效,它确实返回了一个数字,但不是正确的那个。 这里有没有人熟悉这两种语言,能帮我把这个函数翻译过来?
1 个回答
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)