Создание хеша 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 мне удалось создать финальный хэш.
Ответы
Ответ 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;
}