Подтвердить что ты не робот

Создание хеша SHA256 с Crypto ++, используя строку в качестве входных и выходных данных?

Мне нужен пример использования Crypto ++ для генерации хэша SHA256 из std::string и вывода 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" ); это

enter image description here

Как я могу превратить это в читаемый формат?

Благодаря ответу interjay мне удалось создать финальный хэш.

4b9b3361

Ответ 1

Эта строка даст неправильные результаты:

unsigned int nDataLen = sizeof(pbData);

Он всегда будет указывать размер указателя. Вместо этого вам нужно data.size().

Кроме того, вам не нужна эта часть:

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

Он должен всегда корректно проверять, так как вы только что вычислили дайджест на основе тех же данных. И если бы это не так, вы бы отправились в бесконечную рекурсию.

Чтобы получить читаемый вывод, вы можете преобразовать его в шестнадцатеричный. Вот пример MD5 из Crypto ++ Wiki, он должен работать для вас, если вы замените MD5 на SHA256:

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;  

Ответ 2

Это выводит строку base64 с помощью CryptoPP::Base64Encoder:

#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;
}