Создание хэша SHA256 с помощью Crypto++, используя строку в качестве ввода и вывода?
Мне нужен пример использования Crypto++ для генерации хэша SHA256 из строки std::и вывода строки std::. Кажется, я не могу понять. Все, что я пробовал, дает мне неверный результат.
вот новый код после ответа 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"); is
Как я могу превратить это в читаемый формат?
благодаря ответу interjay я смог создать окончательный хэш.
3 ответов
эта строка даст неправильные результаты:
unsigned int nDataLen = sizeof(pbData);
Он всегда будет давать вам размер указателя. Вместо этого вы хотите data.size()
.
кроме того, вам не нужна эта часть:
if(!CryptoPP::SHA256().VerifyDigest(abDigest, pbData, nDataLen))
{
return SHA256(data);
}
Он всегда должен проверять правильно, так как вы только что рассчитали дайджест на основе тех же данных. А если бы это было не так, вы бы вошли в бесконечную рекурсию.
чтобы получить читаемый вывод, вы можете преобразовать его в hex. Вот пример для 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;
это выводит строку 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;
}
ваш код будет ожидать null-завершенной строку из буфера поставить в строку конструктор! Это означает, что результат почти наверняка будет неправильным.
чтобы применить размер дайджеста и использовать вместо этого следующее:
return std::string((char*)abDigest, CryptoPP::SHA256::DIGESTSIZE);
также в отношении его печати следующее правильно производит вектор теста BA7816BF8F01CFEA414140DE5DAE2223B00361A396177A9CB410FF61F20015AD
в строке "abc"
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;
}