Hash

如何在 C++ 中散列塊頭

  • February 12, 2021

我想在 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 &lt;&lt; "digest: " &lt;&lt; digest &lt;&lt; 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 &lt;&lt; "digest2: " &lt;&lt; digest2 &lt;&lt; std::endl;

  return digest2;
}

當我通過此函式傳遞該標頭時,我沒有得到預期的結果。

如何使用 c++ 從格式化的標頭中獲取預期的雜湊?

首先,您有名稱衝突;hash既是std::string傳遞給 的參數calcHash(),也是您的CryptoPP::SHA256對象的名稱。這段程式碼甚至不會編譯,所以你確定這是你正在使用的程式碼嗎?

程式碼本身也有些難以閱讀,因為您將匿名對像傳遞給嵌套建構子以試圖簡潔,但這只會讓讀者感到不必要的困惑。也許您從其他地方複製粘貼了單行字?

無論如何,這是您應該採取的方法:

  1. 使用HexDecoder(not HexEncoder) 將您的輸入字元串(我們稱之為它headerString)轉換為由該十六進製字元串表示的數據的字節數組(稱為 result headerData)。
  2. HashheaderData使用 SHA-256 兩次使用對象的CalculateDigest()方法CryptoPP::SHA256,將結果儲存在一個字節數組中(稱它為hash2,因為我們稱第一個 hash hash1)。
  3. 用於HexEncoder轉換hash2為雜湊的十六進製表示形式的字元串(呼叫它hashString)。

這是程式碼中的內容:

#include &lt;iostream&gt;

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 &lt;&lt; asLowerCase(hashString) &lt;&lt; endl;
}

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