Hash 在C中计算MD5-将输出显示为字符串

Hash 在C中计算MD5-将输出显示为字符串,hash,hex,md5,Hash,Hex,Md5,因此,我尝试使用openssl库在C中创建任意字符串的MD5哈希。 这就是我迄今为止所做的: #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("hell

因此,我尝试使用openssl库在C中创建任意字符串的MD5哈希。 这就是我迄今为止所做的:

#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);
}
#包括
#包括
#包括
void compute_md5(char*str,无符号字符摘要[16]);
int main()
{
无符号字符摘要[16];
compute_md5(“你好,世界”,文摘);
printf(“%s”,摘要);
返回0;
}
void compute_md5(char*str,无符号字符摘要[16]){
MD5_-CTX-CTX;
MD5_Init(&ctx);
MD5_更新(&ctx、str、STREN(str));
MD5_最终版(摘要和ctx);
}
但是,输出中充满了无法打印的字符。
如何正确地将其显示为十六进制字符串?

你说得对,你就是不能使用
printf(“%s”,摘要)
以字符串形式打印
摘要
。注意
无符号字符摘要[16]
将是一个无符号字符数组,不会以nul结尾。不能将其打印为字符串。而是将每个元素打印为带有2个字符的十六进制数字,例如

for (int i = 0; i < 16; i++)
    printf("%02x", digest[i]);
putchar ('\n');
摘要创建字符串

如果需要从
digest
创建一个字符串,可以使用
printf(“%s\n”,buf)打印该字符串
然后创建一个缓冲区,使用
sprintf
将其写入缓冲区,nul终止缓冲区,然后打印字符串,而不是将2字符十六进制表示写入
stdout
。你可以做:

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;
}
intmain()
{
无符号字符摘要[16];
char buf[sizeof digest*2+1];
compute_md5(“你好,世界”,文摘);
对于(int i=0,j=0;i<16;i++,j++=2)
sprintf(buf+j,“%02x”,摘要[i]);
buf[sizeof digest*2]=0;
printf(“%s\n”,buf);
返回0;
}
(输出相同)

如果这不是您想要的,请告诉我。

不是
printf(“%s”,摘要),而不是(inti=0;i<16;i++)printf(“%02x”,摘要[i]);putchar('\n')然后输出为
5eb63bbbe01eeed093cb22bb8f5acdc3
$ ./bin/md5openssl
5eb63bbbe01eeed093cb22bb8f5acdc3
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;
}