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

将gcrypt MD5输出与现有哈希进行比较,c,hash,md5,libgcrypt,C,Hash,Md5,Libgcrypt,我得到了一个MD5输出(一个16字节的十六进制字符串),我需要弄清楚用于生成哈希的消息是什么 我想将它与gcryptsgcry\u md\u hash\u buffer()的输出进行比较,但我确定如何以strcmp()知道两者相同的方式声明它 我之前试过: char answerHash[16] = {0x57, 0x50, 0x1a, 0xc7, 0xb9, 0xd5, 0x44, 0x0a, 0xde, 0xe8, 0xb3, 0xdd, 0x97, 0x09, 0x72, 0xcb};

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

我想将它与gcrypts
gcry\u md\u hash\u 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\u md\u hash\u buffer()获得的输出进行比较

编辑2:


Antoine找到了。memcmp()成功了!非常感谢!

首先,你应该使用
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
#包括
静态常量字符a[16]={0x57、0x50、0x1a、0xc7、0xb9、0xd5、0x44、0x0a、0xde、0xe8、0xb3、0xdd、0x97、0x09、0x72、0xcb};
静态常量字符b[16]={0x57、0x50、0x1a、0xc7、0xb9、0xd5、0x44、0x0a、0xde、0xe8、0xb3、0xdd、0x97、0x09、0x72、0xcb};
returnmemcmp(a,b,16);//=>返回0

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

这是学校作业。这里没有黑帽子。我实际上已经猜出了原始消息(457很酷),这就是answerString。程序必须通过生成字符串,通过MD5发送消息,然后将生成的哈希值与给定的哈希值进行比较,从而强制执行消息。问题是我不知道如何将给定的哈希值以strcmp(或memcmp)的方式输入程序将找到匹配项。对不起,我不理解您的问题。您能否尝试解释一下“如何将给定的哈希值以memcmp将找到匹配项的方式放入程序”的含义?也许您正试图使用printf显示哈希值?正如我在编辑中解释的,这将非常难看:\