簡體   English   中英

使用Crypto ++生成SHA256哈希,使用字符串作為輸入和輸出?

[英]Generating a SHA256 hash with Crypto++, using a string as input and output?

我需要一個如何使用Crypto ++從std :: string生成SHA256哈希並輸出std :: string的示例。 我似乎無法弄明白。 我嘗試的一切都給了我無效的輸出。

這是interjay回答后的新代碼:

string SHA256(string data)
{
    byte const* pbData = (byte*) data.data();
    unsigned int nDataLen = data.size();
    byte abDigest[CryptoPP::SHA256::DIGESTSIZE];

    CryptoPP::SHA256().CalculateDigest(abDigest, pbData, nDataLen);

    return string((char*)abDigest);
}

SHA256的輸出(“A”);

在此輸入圖像描述

如何將其轉換為可讀格式?

感謝interjay的回答,我能夠生成最終的哈希值。

這使用CryptoPP::Base64Encoder輸出base64字符串:

#include "sha.h"
#include "filters.h"
#include "base64.h"

std::string SHA256HashString(std::string aString){
    std::string digest;
    CryptoPP::SHA256 hash;

    CryptoPP::StringSource foo(aString, true,
    new CryptoPP::HashFilter(hash,
      new CryptoPP::Base64Encoder (
         new CryptoPP::StringSink(digest))));

    return digest;
}

這一行會給出錯誤的結果:

unsigned int nDataLen = sizeof(pbData);

它總是會給你一個指針的大小。 你想要的是data.size()

此外,您不需要此部分:

if(!CryptoPP::SHA256().VerifyDigest(abDigest, pbData, nDataLen))
{
    return SHA256(data);
}

它應始終正確驗證,因為您只是根據相同的數據計算摘要。 如果沒有,你將進入無限遞歸。

要獲得可讀輸出,可以將其轉換為十六進制。 這是來自Crypto ++ Wiki的 MD5示例,如果用SHA256替換MD5,它應該適合您:

CryptoPP::MD5 hash;
byte digest[ CryptoPP::MD5::DIGESTSIZE ];
std::string message = "abcdefghijklmnopqrstuvwxyz";

hash.CalculateDigest( digest, (byte*) message.c_str(), message.length() );

CryptoPP::HexEncoder encoder;
std::string output;
encoder.Attach( new CryptoPP::StringSink( output ) );
encoder.Put( digest, sizeof(digest) );
encoder.MessageEnd();

std::cout << output << std::endl;  

您的代碼將期望從您提供給字符串構造函數的緩沖區中以空字符結尾的字符串! 這意味着結果幾乎肯定是錯的。

要強制執行摘要大小,請使用以下代碼:

return std::string((char*)abDigest, CryptoPP::SHA256::DIGESTSIZE);

另外,對於打印它,以下正確生成字符串"abc"的測試向量BA7816BF8F01CFEA414140DE5DAE2223B00361A396177A9CB410FF61F20015AD

std::string string_to_hex(const std::string& input)
{
  static const char* const lut = "0123456789ABCDEF";
  size_t len = input.length();

  std::string output;
  output.reserve(2 * len);
  for (size_t i = 0; i < len; ++i)
  {
    const unsigned char c = input[i];
    output.push_back(lut[c >> 4]);
    output.push_back(lut[c & 15]);
  }
  return output;
}

std::string SHA256(std::string data)
{
  CryptoPP::byte const* pbData = (CryptoPP::byte*)data.data();
  unsigned int nDataLen = data.length();
  CryptoPP::byte abDigest[CryptoPP::SHA256::DIGESTSIZE];

  CryptoPP::SHA256().CalculateDigest(abDigest, pbData, nDataLen);

  // return string((char*)abDigest);  -- BAD!!!
  return std::string((char*)abDigest, CryptoPP::SHA256::DIGESTSIZE);
}

void test_cryptopp() {
  std::cout << string_to_hex(SHA256("abc")) << std::endl;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM