【发布时间】:2014-08-28 07:49:49
【问题描述】:
这些结果有意义吗?
我正在尝试了解 mhash 的工作原理,但有人知道这些结果的意义吗??
mac 是一个字符,基于 strlen 它的长度是 16 但是,mhash 提供的这个示例程序会输出以下十六进制格式 (.x) 的哈希 750c783e6ab0b503eaa86e310a5db738 而且这个 mac[i] 的长度是 16 的两倍,有人知道为什么会这样吗?
// output result
// 0x750c783e6ab0b503eaa86e310a5db738 (MD5) (32)
// mac length: 16
// md5 length: 16
#include <mhash.h>
#include <stdio.h>
#include <string.h>
int main()
{
char password[] = "Jefe";
int keylen = 4;
char data[] = "what do ya want for nothing?";
int datalen = 28;
MHASH td;
unsigned char *mac;
int i, j;
td = mhash_hmac_init(MHASH_MD5, password, keylen, mhash_get_hash_pblock(MHASH_MD5));
mhash(td, data, datalen);
mac = mhash_hmac_end(td);
int md5len = mhash_get_block_size(MHASH_MD5);
printf("0x");
for (i = 0; i < md5len; i++)
{
printf("%.2x", mac[i]);
}
printf("\n");
// I don't understand how the mac is a different size than the version printed out!?
printf("%x\n", mac);
int maclen = strlen(mac);
printf("mac length: %d\n", maclen);
printf("md5 length: %d\n", md5len);
exit(0);
}
另外,如果我尝试使用 printf 输出 mac,如下所示:
printf("%x\n", mac);
我会得到这个:
u
x>j����n1
]�8
mhash 的 API 可以在这里找到:http://mhash.sourceforge.net/mhash.3.html
提前感谢您的帮助
【问题讨论】:
-
提示:单个字节的十六进制表示是两个十六进制数字。
-
您不能将字节数组打印为 %x。您必须遍历数据并单独打印每个字节(最好是 %02x)。
-
printf(..., mac) 将获取 mac 数组第一个字节的地址。并且 %x 将尝试以十六进制打印它。你的输出在我看来更像是一个 %s,因为它正好有 16 个字节(假设每个换行符只添加一个字节,'\n')。
-
还要注意
strlen(mac)可能是未定义的(我不知道具体的mhash,但很可能它是未定义的)。