将gcrypt MD5输出与现有哈希进行比较

时间:2013-12-02 06:24:43

标签: c hash md5 libgcrypt

我得到了一个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哈希,并且可以比较(通过strcmp()或memcmp(),我不挑剔)我从gcry_md_hash_buffer得到的输出( )。

EDIT2:

Antoine得到了它。 memcmp()可以解决问题!非常感谢你!

1 个答案:

答案 0 :(得分:1)

首先,您应该使用memcmp假设固定大小的数组而不是strcmp,它假定以零结尾的字符串,因为您的哈希可能包含零。

其次,我不知道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数组,或char*C不幸的是,它恰好也是字符串的类型。但两者之间的关键区别在于C字符串是零终止的。这意味着接受字符串的每个函数(例如printfstrlen除了char*输入都会被0终止。如果情况并非如此,则危险地扫描变量外部的内存,直到找到0字节为止。