Hash

您如何執行雙 SHA-256 編碼?

  • January 13, 2022

比特幣協議規範給出了雙 SHA-256 編碼的範例。

你好

2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824(第一輪 sha-256)

9595c9df90075148eb06860365df33584b75bff782a510c6cd4883a41(第二輪)

我嘗試了各種 SHA256計算器,第一個編碼匹配沒有問題,但第二個總是解決

d7914fe546b684688bb95f4f888a92dfc680603a75f23eb823658031fff766d9

我也嘗試過大寫並交換字節字節序。

您正在散列第一個散列的十六進製表示。您需要散列實際的散列 - 十六進製表示的二進制數據。

嘗試這個:

$ echo -n hello |openssl dgst -sha256 -binary |openssl dgst -sha256

您想使用摘要,而不是十六進製字元串。

這是一些紅寶石:

require 'digest'
d = Digest::SHA2.new 256
d2 = Digest::SHA2.new 256
d << 'hello'
d.to_s
d2 << d.digest
d2.to_s

這將是來自的輸出irb

1.9.3p194 :001 > require 'digest'
=> true 
1.9.3p194 :003 >   d = Digest::SHA2.new 256
=> #<Digest::SHA2:256 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855> 
1.9.3p194 :004 > d2 = Digest::SHA2.new 256
=> #<Digest::SHA2:256 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855> 
1.9.3p194 :005 > d << 'hello'
=> #<Digest::SHA2:256 2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824> 
1.9.3p194 :006 > d.to_s
=> "2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824" 
1.9.3p194 :007 > d2 << d.digest
=> #<Digest::SHA2:256 9595c9df90075148eb06860365df33584b75bff782a510c6cd4883a419833d50> 
1.9.3p194 :008 > d2.to_s
=> "9595c9df90075148eb06860365df33584b75bff782a510c6cd4883a419833d50"

在 Python 中也是這樣:

import hashlib
d = hashlib.sha256(b"hello")
d2 = hashlib.sha256()
d.hexdigest()
d2.update(d.digest())
d2.hexdigest()

以及 Python shell 中的輸出:

>>> d = hashlib.sha256(b"hello")
>>> d2 = hashlib.sha256()
>>> d.hexdigest()
'2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824'
>>> d2.update(d.digest())
>>> d2.hexdigest()
'9595c9df90075148eb06860365df33584b75bff782a510c6cd4883a419833d50'

引用自:https://bitcoin.stackexchange.com/questions/5671