0

我得到了一个 MD5 输出(一个 16 字节的十六进制字符串),我需要弄清楚用于生成散列的消息是什么。

我想将它与 gcrypts 的输出进行比较gcry_md_hash_buffer(),但我确定如何以一种strcmp()知道两者相同的方式声明它。

我之前试过这个:

char answerHash[16] = {0x57, 0x50, 0x1a, 0xc7, 0xb9, 0xd5, 0x44, 0x0a, 0xde, 0xe8, 0xb3, 0xdd, 0x97, 0x09, 0x72, 0xcb};

但是当我尝试 printf() 时,这最终吃掉了不同字符串的一部分

问题区域示例:

gcry_md_hash_buffer(GCRY_MD_MD5, result, answerString, strlen(answerString));

char answerHash[16] = {0x57, 0x50, 0x1a, 0xc7, 0xb9, 0xd5, 0x44, 0x0a, 0xde, 0xe8, 0xb3, 0xdd, 0x97, 0x09, 0x72, 0xcb};

if(strcmp(result, answerHash) == 0){
printf("strcmp() works.\n");
}

编辑:我认为我没有正确解释这一点。让我们再试一次。

教授有一条秘密消息,并给了我们它的 MD5 哈希输出。他希望我们编写一个程序来通过蛮力找到原始消息。

该消息有 11 个字符长,但他已经告诉我们其中 5 个字符是什么。从这里,我猜到了秘密信息,但我仍然要编写程序。:(

我已经让 MD5 部分工作了,但我需要弄清楚如何将我从 MD5 中获得的输出与他给我们的 MD5 进行对比。

换句话说,我需要声明一个变量,以便它包含 profs 哈希,并且可以与我从 gcry_md_hash_buffer() 获得的输出进行比较(通过 strcmp() 或 memcmp(),我并不挑剔)。

编辑2:

安托万明白了。memcmp() 可以解决问题!非常感谢!

4

1 回答 1

1

首先,您应该使用memcmpwhich 假定固定大小的数组,而不是strcmpwhich 假定以零结尾的字符串,因为您的散列可能包含零。

其次,我不知道answerString从哪里来,但如果你在进行暴力搜索,你不确定恢复原始字符串,只是一个具有相同 MD5 哈希的字符串。这对于您的目的可能或可能不够。

否则,我不确定你的问题是什么:

    #include <string.h>
    static const char a[16] = {0x57, 0x50, 0x1a, 0xc7, 0xb9, 0xd5, 0x44, 0x0a, 0xde, 0xe8, 0xb3, 0xdd, 0x97, 0x09, 0x72, 0xcb};
    static const char b[16] = {0x57, 0x50, 0x1a, 0xc7, 0xb9, 0xd5, 0x44, 0x0a, 0xde, 0xe8, 0xb3, 0xdd, 0x97, 0x09, 0x72, 0xcb};
    return memcmp(a, b, 16); // => returns 0

现在,你提到了printf. 我希望你不做printf(a)?因为您的哈希是一个字符数组,或者不幸的是char*C也恰好是字符串类型。但两者之间的关键区别在于 C 字符串是零终止的。这意味着每个接受字符串的函数,例如printfstrlen将其char*输入除外,都以0. 如果不是这种情况,它将危险地扫描变量外部的内存,直到找到 0 字节。

于 2013-12-02T10:47:17.257 回答