Распечатать результаты функции MD5

Я хочу напечатать MD5 для некоторой строки. Для этого я сделал функцию

std::string generateHashMD5(std::string text)
{
unsigned char * resultHash;
resultHash = MD5((const unsigned char*)text.c_str(), text.size(), NULL);
std::string result;
result += (char *) resultHash;
return result;
}

Я хочу напечатать результат этой функции. Я пытаюсь версию такой функции.

void printHash(std::string hash)
{
for (unsigned i = 0; i < str.size(); i++)
{
int val = (short) hash[i];
std::cout<<std::hex<<val<<':';
}
std::cout<<std::endl;
}std::string printHash(std::string hash)
{
char arrayResult[200];
for(int i = 0; i < 16; i++)
sprintf(&arrayResult[i*2], "%02x", (unsigned short int)hash[i]);
std::string result;
result += arrayResult;
return result;
}

Проблема в том, что, к сожалению, ни один из них не показывает правильный результат. Что нужно изменить в этой функции или где ошибки?

-1

Решение

Вы неправильно используете std::string в качестве буфера:

result += (char *) resultHash;

обрабатывает resultHash как c-строку, поэтому, если в середине есть байт \ 0, он не получит достаточно данных. Если байта \ 0 нет, вы скопируете слишком много и получите UB. Вы должны использовать конструктор с размером:

std::string result( static_cast<const char *>( resultHash ), blocksize );

где размер блока, вероятно, равен 16. Но я бы рекомендовал использовать std::array<uint8_t,blocksize> или же std::vector<uint8_t> вместо ОС std::string, как std::string для буфера очень сбивает с толку.

1

Другие решения

в случае, если MD5 возвращает байтовый массив

result += (char *) resultHash;
return result;

преобразование в строку потеряет числа после 0, потому что строковый конструктор интерпретирует ввод как строку с нулевым символом в конце
Таким образом, можно использовать вектор или строковую конструкцию с явным количеством символов.

Тем не менее, недостаточно информации, чтобы сказать точно

0

По вопросам рекламы [email protected]