Эта строка даст неправильные результаты:
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;