Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MD5哈希时填充字符串 我试图在C++中实现MD5哈希函数,并通过一些网站上找到的一些输入值得到正确的结果,这些值是十六进制值。到目前为止,我一直能使它正常工作。然而,当我尝试用ASCII字符串做同样的事情时,我运气不佳,无法真正理解我还应该做什么_C++_Hash_Cryptography_Md5 - Fatal编程技术网

MD5哈希时填充字符串 我试图在C++中实现MD5哈希函数,并通过一些网站上找到的一些输入值得到正确的结果,这些值是十六进制值。到目前为止,我一直能使它正常工作。然而,当我尝试用ASCII字符串做同样的事情时,我运气不佳,无法真正理解我还应该做什么

MD5哈希时填充字符串 我试图在C++中实现MD5哈希函数,并通过一些网站上找到的一些输入值得到正确的结果,这些值是十六进制值。到目前为止,我一直能使它正常工作。然而,当我尝试用ASCII字符串做同样的事情时,我运气不佳,无法真正理解我还应该做什么,c++,hash,cryptography,md5,C++,Hash,Cryptography,Md5,我所做的第一件事是将ASCII字符串转换为十六进制值,并在末尾附加单个0x80,之后是一组0x00,最后八个字节是非附加消息的十六进制长度 例如,“test123”以十六进制表示为“0x74、0x65、0x73、0x74、0x31、0x32、0x33”,其字节长度为7。那么我得到的用作哈希函数输入的字节数组如下所示 const uint8_t test123Array[64] = { 0x74, 0x65, 0x73, 0x74, 0x31, 0x32, 0x33, 0x80, 0x00

我所做的第一件事是将ASCII字符串转换为十六进制值,并在末尾附加单个0x80,之后是一组0x00,最后八个字节是非附加消息的十六进制长度

例如,“test123”以十六进制表示为“0x74、0x65、0x73、0x74、0x31、0x32、0x33”,其字节长度为7。那么我得到的用作哈希函数输入的字节数组如下所示

const uint8_t test123Array[64] = {
    0x74, 0x65, 0x73, 0x74, 0x31, 0x32, 0x33, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07
};
当我应用散列函数时,得到的结果是

e7 54 fa ea 1e d7 69 ba 85 59 62 bf 16 e9 98 48
而我通过在线哈希生成器网站得到的结果是

cc 03 e7 47 a6 af bb cb f8 be 76 68 ac fe be e5

数据的长度不是以字节计,而是以位计。因此,长度不是7,而是56(0x38)。然后将该长度按字节顺序编码为64位

准备好的输入应如下所示:

const uint8_t test123Array[64] = {
    0x74, 0x65, 0x73, 0x74, 0x31, 0x32, 0x33, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};

您链接到的目录包含您需要了解的所有信息。请仔细查看“3.2步骤2.追加长度”部分和“a.3 md5c.c”部分中的
Encode
函数。

最后的
0x07
功能是什么?这不是填充规范的一部分。既然有大量现有的公共域MD5实现可以工作,为什么还要重新发明轮子呢?()我在链接中找到了规范,关于填充,我看不出哪里做错了。非常感谢,我为它奋斗了很长时间,它只是正常工作。@Artjom B.它不是很小吗?0x38是最低有效字节,在您的示例中(较低的数组索引)早于较高有效字节。