Вычислить MD5 в C - Показать вывод в виде строки - PullRequest
0 голосов
/ 23 сентября 2019

Итак, я пытаюсь создать MD5-хеш произвольной строки в C, используя openssl lib.Это то, что я так далеко:

#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);
    printf("%s", digest);
    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);
}

Однако вывод полон непечатных символов.Как я могу правильно отобразить его в виде шестнадцатеричной строки?

1 Ответ

0 голосов
/ 23 сентября 2019

Вы правильно поняли, вы просто не можете использовать 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;
}

(вывод такой же)

Дайте мне знать, если это не то, что вы ищете.

...