Hash 在C中计算MD5-将输出显示为字符串
因此,我尝试使用openssl库在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
#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;
}