一个单独的“1”比特位的SHA-256哈希值是什么?

11

SHA-256的定义似乎是这样的,仅包含单个“1”位的输入具有明确定义的哈希值,并且与“01”字节的哈希值不同(因为填充是基于输入的位数完成的)。

但是,由于字节序问题以及我找不到任何支持输入单个位的实现,我无法弄清楚正确的哈希值是什么。

那么,“1”比特的长度为1的输入的正确哈希值是什么?(不是长度为8的byte[] {1}输入)。


1
您可以手动计算它:http://en.wikipedia.org/wiki/SHA-2#SHA-256_.28a_SHA-2_variant.29_pseudocode,但这会变得相当乏味。 - Tyler
1
抱歉加了这么多问号,评论有愚蠢的字符限制。 - dan_waterworth
2
@Eric,拥有不是 8 的倍数的位数有什么奇怪的地方吗? - Roman Starkov
5
@Eric你好像认为永远没有计算短输入哈希的原因。我可以给你一个:验证实现的正确性。0 bit输入的哈希值可以用作测试用例之一。两个1 bit字符串也很方便。如果你不想回答这个问题,那就别回答,但我不明白为什么你似乎在暗示这个问题很愚蠢。 - Roman Starkov
4
@Eric Fortis:我对这个问题并不觉得有什么离奇的地方。哈希函数本身就是根据任意长的比特串进行定义的,所以为什么不会有人对实际计算这些任意的比特串感兴趣呢?而且为了测试,显然你需要测试一些简单的情况,比如一个比特或两个比特。 - President James K. Polk
显示剩余8条评论
3个回答

11

根据我的实现:

1 位字符串 "1"

B9DEBF7D 52F36E64 68A54817 C1FA0711 66C3A63D 384850E1 575B42F7 02DC5AA1

1位二进制字符串 "0":

BD4F9E98 BEB68C6E AD3243B1 B4C7FED7 5FA4FEAA B1F84795 CBD8A986 76A2A375

我已经在几个标准的 8 位倍数输入上测试了此实现,包括 0 位字符串,并且结果正确。

(当然,这个问题的重点是首先验证上述输出,因此请小心使用...)


1
我确认这些值。我自己实现的SHA-2来自sphlib(http://www.saphir2.com/sphlib/)。C代码处理长度不是8的倍数的输入。 - Thomas Pornin
同时,这也得到了Perl实现的确认,它接受二进制编码字符串。 - Roman Starkov
还通过 https://pypi.org/project/sha256bit/ 进行了确认(好吧,1位“0”肯定是正确的,因为它与NIST在 https://csrc.nist.gov/CSRC/media/Projects/Cryptographic-Algorithm-Validation-Program/documents/shs/shabittestvectors.zip 中给出的测试向量相匹配,参见 SHA256ShortMsg.rsp) - acapola

3

不确定我是否正确理解了你的问题。

SHA-256使用64字节(=512位)的块大小进行操作。这意味着较小的输入必须首先进行填充。填充的结果如下:

For Bit 1:    1100000000000...00000000001
For Bits 01:  0110000000000...00000000010

由于这些结果是不同的,以下压缩函数的结果也将如此。因此哈希值也是不同的。标准文档详细解释了填充方式:http://csrc.nist.gov/publications/fips/fips180-2/fips180-2.pdf


1
不仅SHA-256如此,我想不出任何算法不会填充或重复小输入的情况。 - Eric Fortis
1
SHA256的块大小为512位,而非256位。请参阅RFC:4634“美国安全哈希算法(SHA和HMAC-SHA)”,http://www.ietf.org/rfc/rfc4634.txt。 - Babu Srinivasan
@BabuSrinivasan 确认。hashlib.sha256().block_size 返回 64 - Tyler Pantuso

2

RFC 4634第8节中提供了C代码,用于计算不一定是8位的数据的哈希值。请参阅名称为SHA*FinalBits(...)的方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接