研究了一位cpu矿工的源代码,我找到了这段代码:
work->data[20] = 0x80000000;
好吧,我问了关于它的编码,他的回答是:
“这些值是标准SHA-2填充的一部分”
谷歌搜索“沙2填充”没有帮助。你能告诉我这是为了什么吗?
我认为 md5 / sha256 函数只需获取数据并返回哈希值。
我不理解“填充”概念。
答案 0 :(得分:3)
您可以在RFC 4634 -- SHA and HMAC-SHA第4.1节中找到它。引自第4部分的引言:
作为总结,在消息的末尾附加一个“1”后跟一些“0”,后跟一个64位或128位整数。
0x80000000
是二进制的10000000000000000000000000000000
。这是您的“1”,后跟一些“0”。
原因是SHA-256通过将其分成固定大小的块来处理输入。最后一个块可能更小,因此它被扩展(填充)直到其大小与预期的块大小匹配。
答案 1 :(得分:1)
大多数现代加密哈希函数以固定长度块处理消息;除了最早的哈希函数之外的所有函数都包含某种填充方案。加密散列函数必须采用终止方案来防止散列容易受到长度扩展攻击。其余的可以在wiki
找到用我自己的话解释:如果你想加密一个文本,算法会分成相同大小的块,如果你在最后一个块没有足够的数据,那么算法会增加0,直到它具有相同的值。与其他人一样大小。
答案 2 :(得分:1)
SHA-2哈希基于Merkle-Damgård scheme构建。这意味着散列函数基于单向压缩函数,该函数取n + r位输入并输出r位。因此,必须将输入划分为n位块,以便可以使用最后一轮的输出将压缩函数应用于每个块。
填充是必要的,使得输入可以被划分为n位块。特别是出于安全原因使用Merkle-Damgård compliant padding(有关详细信息,请参阅链接)。
答案 3 :(得分:0)
基本上,哈希算法需要特定的块大小(固定的字节数)才能使用。添加"填充"到消息的末尾使它到达下一个块字节的倍数。但是,您还需要知道实际消息的大小。通过向消息添加1位后跟足够的0位,您可以从消息末尾读回,直到您按下第一个1位,这就是消息的结束,因此您知道大小它