【问题标题】:Debugging Hashed Results: Lengths, Arrays, Chars调试散列结果:长度、数组、字符
【发布时间】: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,但很可能它是未定义的)。

标签: c arrays string hash hex


【解决方案1】:

不要将mac 作为字符串(作为字符数组或指向字符串第一个字符的指针)。

mac 被读取为一个字节数组,其大小是预先知道的(mhash_get_block_size 的结果)。

strlen(mac) 未定义。只有偶然你会得到正确的大小(想想恰好有一个零字节的哈希:它会过早地结束想要的字符串)。

【讨论】:

  • 好的,非常感谢,所以把 mac 想象成一个字节数组,明白了!所以,基本上,如果我想知道它的长度,我所要做的就是将块大小乘以 2?
  • 没有。它的大小是正好 块大小。您必须分别了解散列的大小(对于 MD5,它是 16 个字节)和其转换为字符的长度。
  • 它的十六进制表示是两倍大小,因为每个字节需要两个十六进制数字(从 00 到 ff)。
  • 另外,您知道密码和密钥的用途吗?我知道这不是问题的一部分,但如果我能提供一些意见那就太好了,我将研究为什么我们需要这两个属性
  • 如果您在 base64 中表示散列(16 字节 = 128 位)(另一种每个数字可以表示 6 位的编码),则需要 22 个字符(最后一个仅部分)。
猜你喜欢
  • 2017-12-26
  • 1970-01-01
  • 2010-09-15
  • 1970-01-01
  • 2012-06-30
  • 2016-09-18
  • 2013-12-22
  • 1970-01-01
  • 2023-04-01
相关资源
最近更新 更多