2016-06-10 106 views
0

我想散列一個比特幣私鑰來獲取校驗和,並且python中的兩個不同的庫(hashlib + pycrypto)正在返回相同的錯誤結果(僅在1個散列之後)。Sha256返回不正確的哈希值?

在Linux終端,我得到正確的散列結果與線:

echo -n 8018ac3e7343f016890c510e93f935261169d9e3f565436429830faf0934f4f8e4 | xxd -r -p | sha256sum -b 
result: cd358f378809b3043ded3782d849fbad70f92a2dadefafd985d9aef443752e57 

然而,hashlib,pycrypto,以及在線SHA2哈希工具返回值:

5d6dce0f36a50abe51ee435ac11dac05f7879c1cd1ca5bc7aae706e5a3776d4a 

我米不知道他們爲什麼返回不同的值。

這裏有兩個由它們生成的WIF密鑰,第一個使用命令行功能,第二個使用python;第二個是無效的(不被錢包軟件接受)。

5J19pGYtJzuS7VoAQjxDjUGgWXSNqj18GWSWvFVqJzQqGtxZf2V 
5J19pGYtJzuS7VoAQjxDjUGgWXSNqj18GWSWvFVqJzQqGvDc8hm 
+3

Python庫不會返回錯誤的值。告訴我們你的代碼,我們可能會告訴你爲什麼你有麻煩。 (我猜猜它與Python 2中常見的unicode /字符串混淆有關。) –

+0

我認爲問題是因爲'xxd -r -p'。如果您嘗試'echo -n 8018ac3e7343f016890c510e93f935261169d9e3f565436429830faf0934f4f8e4 | sha256sum -b'你也會得到*不正確的散列值*。但是我不知道'xxd'是幹什麼的,但是你把'xxd'的結果傳給了Python'sha256'還是隻是字符串? –

+1

@KevinGuan'xxd -r -p'是「反轉hexdump」,即它應該將十六進制轉換回二進制。 – melpomene

回答

2
import hashlib 

print(
    hashlib.sha256("8018ac3e7343f016890c510e93f935261169d9e3f565436429830faf0934f4f8e4").hexdigest() 
) 

print(
    hashlib.sha256("8018ac3e7343f016890c510e93f935261169d9e3f565436429830faf0934f4f8e4".decode("hex")).hexdigest() 
) 

通知的區別:

第一散列碼十六進制字符串。

第二次散列字符串,由十六進制解碼返回。