Имеют ли эти результаты смысл?
Я пытаюсь понять, как работает 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);
}
Кроме того, если я попытаюсь вывести mac с помощью printf, как показано ниже:
printf("%x\n", mac);
Я бы получил это:
u
x>j����n1
]�8
API для mhash можно найти здесь: http://mhash.sourceforge.net/mhash.3.html
заранее спасибо за помощь
keylen
, то это простоsizeof password - 1
(-1, чтобы убрать автоматический\0
). На самом деле вы вычисляете не MD5 (в смысле четкой контрольной суммы MD5), а HMAC который использует MD5 Подписать данные. Ключ (илиpassword
здесь) — это часть информации, которую следует держать в секрете, чтобы гарантировать, что ваши данные не были затронуты (иначе хеш-подпись будет другой). 07.07.2014