Вы правильно поняли, вы просто не можете использовать printf("%s", digest);
для печати digest
в виде строки.Обратите внимание, что unsigned char digest[16];
будет массивом без знака char и не будет с нулевым окончанием .Вы не можете напечатать это как строку.Вместо этого напечатайте каждый элемент в виде шестнадцатеричного числа с 2 символами, например,
for (int i = 0; i < 16; i++)
printf("%02x", digest[i]);
putchar ('\n');
Ваш полный пример будет таким:
#include <stdio.h>
#include <string.h>
#include <openssl/md5.h>
void compute_md5(char *str, unsigned char digest[16]);
int main()
{
unsigned char digest[16];
compute_md5("hello world", digest);
for (int i = 0; i < 16; i++)
printf("%02x", digest[i]);
putchar ('\n');
return 0;
}
void compute_md5(char *str, unsigned char digest[16]) {
MD5_CTX ctx;
MD5_Init(&ctx);
MD5_Update(&ctx, str, strlen(str));
MD5_Final(digest, &ctx);
}
Пример использования / Вывод
$ ./bin/md5openssl
5eb63bbbe01eeed093cb22bb8f5acdc3
Создание строки из digest
Если вам нужно создать строку из digest
, которую можно распечатать с помощью printf ("%s\n", buf);
, то вы создадите буфери вместо записи шестнадцатеричного шестнадцатеричного представления в stdout
, используйте sprintf
, чтобы записать его в буфер, завершить буфер нулем, а затем распечатать строку.Вы можете сделать:
int main()
{
unsigned char digest[16];
char buf[sizeof digest * 2 + 1];
compute_md5("hello world", digest);
for (int i = 0, j = 0; i < 16; i++, j+=2)
sprintf(buf+j, "%02x", digest[i]);
buf[sizeof digest * 2] = 0;
printf ("%s\n", buf);
return 0;
}
(вывод такой же)
Дайте мне знать, если это не то, что вы ищете.