我得到了一个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()可以解决问题!非常感谢你!
答案 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字符串是零终止的。这意味着接受字符串的每个函数(例如printf
或strlen
除了char*
输入都会被0
终止。如果情况并非如此,则危险地扫描变量外部的内存,直到找到0字节为止。