【问题标题】:What is the SHA-256 hash of a single "1" bit?单个“1”位的 SHA-256 哈希是多少?
【发布时间】:2011-05-24 07:19:15
【问题描述】:

SHA-256 的定义似乎是,由单个“1”位组成的输入具有明确定义的哈希值,不同于“01”字节(因为填充是根据输入的比特长度完成的)。

但是,由于字节顺序问题以及我找不到支持单比特馈送的实现这一事实,我无法完全弄清楚这个正确的值是什么。

那么,由位“1”组成的 1 位长 输入的正确散列是什么? (不是 8 位长 byte[] { 1 } 输入)。

【问题讨论】:

  • 您可以手动计算:en.wikipedia.org/wiki/… 但很快就会变得非常乏味。
  • 不好意思加了这么多问号,愚蠢的cmets下限。
  • @Eric 比特数不是 8 的倍数有什么奇怪的?
  • @Eric 您似乎认为没有理由计算短输入的哈希值。我可以给你一个:验证实现的正确性。 The hash of the 0 bit input 可以作为测试用例之一。两个 1 位字符串也很方便。如果您不想回答这个问题,那么无论如何都不要回答,但我不明白为什么您似乎暗示这个问题很愚蠢。
  • @Eric Fortis:我认为这个问题没有什么古怪之处。散列函数本身是根据任意长的位串定义的,所以为什么不应该有人对实际计算这样的任意位串感兴趣。而对于测试,显然你想测试一个或两个位这样的琐碎案例。

标签: algorithm language-agnostic hash sha


【解决方案1】:

好的,根据我自己的实现:

1 位字符串“1”

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

1 位字符串“0”

BD4F9E98 BEB68C6E AD3243B1 B4C7FED7 5FA4FEAA B1F84795 CBD8A986 76A2A375

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

(当然这个问题的重点是首先验证上面的输出,所以要小心使用......)

【讨论】:

  • 我确认这些值。我自己的 SHA-2 实现来自 sphlib (saphir2.com/sphlib)。 C 代码处理长度不是 8 倍数的输入。
  • Perl 的实现也证实了这一点,它接受二进制编码的字符串。
【解决方案2】:

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

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

【讨论】:

  • 不仅是 SHA-256,我想不出任何不填充或重复小输入的算法。
  • SHA256 的块大小是 512 位而不是 256 位。请参阅 RFC:4634“美国安全散列算法(SHA 和 HMAC-SHA)”,ietf.org/rfc/rfc4634.txt
【解决方案3】:

RFC 4634section 8 中有可用的 C 代码来计算不一定是 8 位倍数的数据的哈希值。查看名称为SHA*FinalBits(...) 的方法。

【讨论】:

    猜你喜欢
    • 2014-08-19
    • 2011-11-14
    • 2023-03-18
    • 2013-01-09
    • 2020-04-16
    • 2023-03-27
    • 2021-11-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多