2014-07-07 30 views
1

這些結果是否有意義?調試散列結果:長度,數組,字符

我想了解mhash是如何工作的,但沒有人知道這些結果是如何理解的?

MAC是char,並且基於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 

爲mhash的API可以在這裏找到:http://mhash.sourceforge.net/mhash.3.html

感謝您的幫助提前

+4

提示:單個字節的十六進制表示是兩位十六進制數字。 – zwol

+0

您不能將字節數組打印爲%x。您必須循環訪問數據並逐個打印每個字節(最好爲%02x)。 – rslemos

+0

printf(...,mac)將取得mac陣列的第一個字節的地址。 %x將嘗試以十六進制打印它。你的輸出在我看來更像是%s,因爲它有16個字節(假設每個換行符只增加一個字節,'\ n')。 – rslemos

回答

1

不要將mac作爲字符串(作爲char數組或指向字符串的第一個char的指針)。

mac將被讀取爲字節數組,其大小事先已知(結果爲mhash_get_block_size)。

strlen(mac)未定義。只有偶然的情況下,你才能得到正確的大小(想象一下恰好有零字節的散列:它會過早地結束想要的字符串)。

+0

好的,非常感謝你,所以把mac想象成一個字節數組,明白了!所以,基本上,如果我想知道它的長度,我所要做的就是將塊大小乘以2? – humblebeast

+0

不,它的大小是**正好**塊大小。你必須分別理解你的散列的大小(對於MD5它是16個字節)以及其對字符的解除長度。 – rslemos

+0

它的十六進制表示是這個尺寸的兩倍**,因爲**每個字節需要兩個十六進制數字(從00到ff)。 – rslemos