Я написал простой пример с openssl в C. Я хотел вычислить хэш MD4 из моего сообщения, но я хочу сохранить результат в массив символов. Heres мой код с комментариями, которые помогут вам понять, что я хочу добиться:MD4 хэш с openssl, сохранить результат в char char
#include <string.h>
#include <openssl/md4.h>
#include <stdio.h>
int main()
{
unsigned char digest[MD4_DIGEST_LENGTH];
char string[] = "hello world";
// run md4 for my msg
MD4((unsigned char*)&string, strlen(string), (unsigned char*)&digest);
// save md4 result into char array - doesnt work
char test[MD4_DIGEST_LENGTH];
sprintf(test, "%02x", (unsigned int)digest);
for(int i = 0; i < MD4_DIGEST_LENGTH; i++)
printf("%02x", test[i]);
printf("\n\n");
// print out md4 result - works, but its not intochar array as I wanted it to be
for(int i = 0; i < MD4_DIGEST_LENGTH; i++)
printf("%02x", digest[i]);
printf("\n\n");
// works but i dont understand why 'mdString' is 33 size
char mdString[33];
for(int i = 0; i < MD4_DIGEST_LENGTH; i++)
// and I also dont get i*2 in this loop
sprintf(&mdString[i*2], "%02x", (unsigned int)digest[i]);
printf("md4 digest: %s\n", mdString);
return 0;
}
Вопрос в том, почему этот код ниже не работает, он показывает другое значение MD4, чем она должна быть:
char test[MD4_DIGEST_LENGTH];
sprintf(test, "%02x", (unsigned int)digest);
for(int i = 0; i < MD4_DIGEST_LENGTH; i++)
printf("%02x", test[i]);
printf("\n\n");
и как я могу узнать, какой размер должен быть mdString
и почему i*2
в последнем цикле? Может ли кто-нибудь объяснить это?
спасибо! Но не могли бы вы объяснить, что немного преобразует 'unsigned char digest' в' шестнадцатеричное целое число'? Я не знаю, почему я должен использовать 'i * 2' в моем цикле' sprintf', и как я могу узнать, что результат 'mdString' должен иметь размер 33? – yak
@yak, извините за это, обновил свой первоначальный ответ с объяснением размера критического массива. – easuter
еще раз спасибо! :) У меня только последний вопрос (надеюсь, так;): когда я хочу измерить производительность md5 для сообщения с размером входного файла 512, должен ли я сделать это следующим образом: '// Предположим, что 'txt' имеет длину 64, // поэтому для char его 8 (размер char) * 64 (длина текста) = 512 размер блока char txt = "..."; MD5 (txt, strlen (txt), digest); 'или вот так: ' char txt = "..."; // предположим, что имеет длину 512 MD5 (txt, strlen (txt), digest); '. На вопрос об этом также: http://security.stackexchange.com/questions/38903/openssl-speed-block-size?lq=1, но все отвечают. Спасибо :) – yak