gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 05:08:48 43 4
gpt4 key购买 nike

所以我尝试使用 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);
}

但是输出充满了不可打印的字符。如何将其正确显示为十六进制字符串?

最佳答案

你没看错,只是不能使用 printf("%s", digest);digest 打印为字符串。请注意,unsigned char digest[16]; 将是一个unsigned char 数组,并且不会以nul 结尾。您不能将其打印为字符串。而是将每个元素打印为具有 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); 打印的字符串,那么您可以创建一个缓冲区,而不是将 2 个字符的十六进制表示写入 stdout,使用 sprintf 将其写入缓冲区,以 nul 终止缓冲区,然后打印字符串。你可以这样做:

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;
}

(输出相同)

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

关于hash - 在 C 中计算 MD5 - 将输出显示为字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58065208/

43 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com