SHA-1使用特定的缓冲区初始化:

h0 = 0x67452301
h1 = 0xEFCDAB89
h2 = 0x98BADCFE
h3 = 0x10325476
h4 = 0xC3D2E1F0?


为什么?

#1 楼

Merkle-Damgård类型哈希函数的初始值本质上是分组密码的明文,而哈希函数的输入则成为密钥。散列的最大长度由初始值的位数决定。五个32位字使SHA1具有状态大小,最大输出为160位。为了使MD类型的哈希函数输出一致的值,初始值必须恒定。

前4个值是MD4和MD5中使用的值。它们以大端顺序格式表示。如果用little-endian表示,则可以看到它是一个简单的4位计数器,从0000开始,在1111处最大,然后以32位为一组反向反向: 0111 0110 0101 0100 0011 0010 0001 0000 = LE 0x76543210 = BE 0x67452301 1111 1110 1101 1100 1011 1010 1001 1000 = LE 0xFEDCBA98 = BE 0xEFCDAB89

最终的big-endian值是奇数4位组从1100开始的递增计数器,偶数组从0011开始在递减计数器。 Nothing Up My Sleeve数字,并且被选择为证明常数的一种方法不是特别选择的,例如为算法提供后门。根据figlesquidge的评论,为什么这些不是简单的0位,整个初始值集合的平均汉明权重为0.5,一半位为1,一半为0。

舍入常数SHA-1也被选择为不是“特殊”的,但是生成方式却完全不同。它们取二进制数的平方根,然后前32位(包括小数点前的那些)成为舍入常数。这与生成MD4的两个取整常量的方法相同。

1000 1001 1010 1011 1100 1101 1110 1111 = LE 0x89ABCDEF = BE 0x98BADCFE = $ \ sqrt2 $ 0000 0001 0010 0011 0100 0101 0110 0111 = LE 0x01234567 = BE 0x10325476 = $ \ sqrt3 $ 0x5A827999 = $ \ sqrt5 $ 0x6ED9EBA1 = $ \ sqrt {10} $

最初的MD4论文以及RFC中都指定了前2个舍入常量的设计标准。初始值的选择从未定义或解释过,这很可能是由于模式的明显性。 FIPS-180-1和更高版本中未解释初始值和舍入常数的选择。有趣的是,他们选择10来生成最终的舍入常数而不是7,因为它不是素数。

选择$ \ sqrt {10} $代替$ \ sqrt7的一种可能解释$可能是$ \ sqrt {10} $与其他三个常数一起,是Donald Knuth的《计算机艺术》附录A表2“数字量表”中给出的唯一平方根编程,卷。 2:Seminumerical Algorithms,第二版(1981年),第1页。 660,在原始RFC 1320到MD4(第4页)中将其作为常量的来源。在本书的第三版(1997)中,这些内容可以在第727页找到。

SHA-2(256位和512位摘要)比较时使用的小数部分(仅小数点后)连续素数2至19的平方根为初始值,连续素数2至311的立方根的分数成分为圆形常数。

评论


$ \ begingroup $
为什么它们不能简单地归零?
$ \ endgroup $
–密码学家
13-10-25在15:26

$ \ begingroup $
@ user8911我想他们想要得到1位和0位的均等分布,这就是他们得到的。具有更好密钥可变性或较大状态的算法可能没有此要求。 SHA256设置了53.1%的IV位,SHA224 = 50.8%,SHA384 = 49.8%,SHA512 = 53.9%。
$ \ endgroup $
– Richie车架
13-10-29在5:25

$ \ begingroup $
谢谢。我在这里将评论变成了自己的问题
$ \ endgroup $
–密码学家
13-10-29在10:04

$ \ begingroup $
TAoCP第2卷第三版中的第726页。
$ \ endgroup $
– Iiridayn
19-10-4在19:26

$ \ begingroup $
@Iiridayn谢谢,我将为第三次增编增补
$ \ endgroup $
– Richie车架
19-10-4在23:39

#2 楼

如果问题是“为什么这些变量根本没有初始化”,那是因为这些值将用作初始SHA-1压缩函数的输入;它们必须是一致的值;否则,生成的哈希将有所不同(取决于所使用的值)。

如果问题是“为什么使用这些特定值(而不是其他值)”,我不相信NIST曾经正式发表过这种推理。但是,十六进制的那些值遵循一个模式。这意味着选择它们时要考虑一些特殊属性。

评论


$ \ begingroup $
一致性值是什么意思?
$ \ endgroup $
–贾斯汀·托马斯(Justin Thomas)
16年8月29日在17:15

$ \ begingroup $
@JustinThomas:在哈希函数中,假定拥有该消息的任何人都可以计算该消息的哈希。因此,在SHA-1中,如果人们为h0-h4使用了不同的值,则产生的哈希将有所不同。因此,两个不同的值(例如Alice和Bob)需要保持一致,即它们以相同的初始状态开始;因此,如果他们计算相同消息的哈希,他们将获得相同的结果
$ \ endgroup $
–雨披
16年8月29日在17:42

$ \ begingroup $
是的,除了上面所说的0和1的分配,我只是不遵循为什么不为零的逻辑。这似乎很明显,我永远也不想说出来,谢谢您的回应!
$ \ endgroup $
–贾斯汀·托马斯(Justin Thomas)
16年8月30日在15:32