Hash
如何在 C++ 中散列塊頭
我想在 C++ 中散列一個塊頭,但不知道如何。
我現在只是在使用一個測試塊,這樣我就知道預期的結果是什麼。<https://www.blockchain.com/btc/block/669892>
我有一個將塊頭格式化為十六進製字元串的函式
0000ff3fd90c0dfca35c8738aa92e1c5bdf706ba14eaafbb379206000000000000000000ad66d8cda0330c3af011ba6b7bc705789767c55a72a818685b3e06a0b8b9a2b054e82260b9210d17099976a6
現在,我正在努力正確地將其散列到預期
000000000000000000064ec839564cc03166184f0a404d82cad9c655f714d886
static void calcHash(std::string hash){ CryptoPP::SHA256 hash; std::string digest; CryptoPP::StringSource(data, true, new CryptoPP::HashFilter(hash, new CryptoPP::HexEncoder(new CryptoPP::StringSink(digest) ))); std::cout << "digest: " << digest << std::endl; CryptoPP::SHA256 hash2; std::string digest2; CryptoPP::StringSource(digest, true, new CryptoPP::HashFilter(hash2, new CryptoPP::HexEncoder(new CryptoPP::StringSink(digest2) ))); std::cout << "digest2: " << digest2 << std::endl; return digest2; }
當我通過此函式傳遞該標頭時,我沒有得到預期的結果。
如何使用 c++ 從格式化的標頭中獲取預期的雜湊?
首先,您有名稱衝突;
hash
既是std::string
傳遞給 的參數calcHash()
,也是您的CryptoPP::SHA256
對象的名稱。這段程式碼甚至不會編譯,所以你確定這是你正在使用的程式碼嗎?程式碼本身也有些難以閱讀,因為您將匿名對像傳遞給嵌套建構子以試圖簡潔,但這只會讓讀者感到不必要的困惑。也許您從其他地方複製粘貼了單行字?
無論如何,這是您應該採取的方法:
- 使用
HexDecoder
(notHexEncoder
) 將您的輸入字元串(我們稱之為它headerString
)轉換為由該十六進製字元串表示的數據的字節數組(稱為 resultheaderData
)。- Hash
headerData
使用 SHA-256 兩次使用對象的CalculateDigest()
方法CryptoPP::SHA256
,將結果儲存在一個字節數組中(稱它為hash2
,因為我們稱第一個 hashhash1
)。- 用於
HexEncoder
轉換hash2
為雜湊的十六進製表示形式的字元串(呼叫它hashString
)。這是程式碼中的內容:
#include <iostream> using namespace std; using namespace CryptoPP; static void printHash(std::string headerString) { // Convert hex string to byte array string headerData; HexDecoder decoder = new HexDecoder(new StringSink(headerData)); decoder.Put((byte*)headerString.data(), headerString.size()); decoder.MessageEnd(); // Hash the byte array twice SHA256 hasher; byte hash1[SHA256::DIGESTSIZE]; hasher.calculateDigest(hash1, (byte*)headerData.data(), headerData.size()); byte hash2[SHA256::DIGESTSIZE]; hasher.calculateDigest(hash2, hash1, hash1.length); // Convert result to hex string string hashString; HexEncoder encoder = new HexEncoder(new StringSink(hashString)); encoder.Put(hash2, sizeof(hash2)); encoder.MessageEnd(); // Print the hash cout << asLowerCase(hashString) << endl; }