3

我正在尝试了解 SHA-1,我正在查看规范 (RFC 31741) 中包含的 C 实现,这部分让我感到困惑:

context->Intermediate_Hash[0]   = 0x67452301;
context->Intermediate_Hash[1]   = 0xEFCDAB89;
context->Intermediate_Hash[2]   = 0x98BADCFE;
context->Intermediate_Hash[3]   = 0x10325476;
context->Intermediate_Hash[4]   = 0xC3D2E1F0;

那些硬编码的十六进制值有什么意义,它们只是使算法工作的特殊调味料,还是它们代表一些数学常数?

您可以在此处查看完整代码:http: //www.faqs.org/rfcs/rfc3174.html

4

3 回答 3

1

为了避免过于冗长的答案,它们只是算法特定的常量。作为类似用法的示例,请参阅Carmack Square Root。它通过提供初始的幼稚猜测,使用特殊值作为加速传统平方根方法的一种方式。

正如代码所暗示的,它们只是帮助充当中间散列元素的数字。它们不一定像您可能暗示的数学常数那样具有任何含义,但它们对算法很重要。

于 2009-04-18T20:58:47.180 回答
1

它没有回答您的问题,但请注意,对 SHA-1 的真正引用(如 RFC 中所述)是FIPS 180。没有更多的解释,但至少它是原始来源:-(

另外,请记住 SHA-1 今天已受到严重威胁

于 2009-04-19T09:19:20.083 回答
1

它们是“我的袖珍号码”

所选值没有特殊属性。这些数字与随机选择的值具有相同的属性,但不允许算法设计者选择它们。选择常量的算法设计者可能允许他嵌入某种后门,因此它们的选择方式尽可能地降低了自由度。

典型的选择包括 pi 的第一个数字,或者在 SHA-1 小素数平方根的情况下:

使用的常数值被选为我的袖珍数字:四个圆形常数 k 是 2、3、5 和 10 的平方根的 2^30 倍。h0 到 h3 的前四个起始值与 MD5 相同算法,和第五个(对于h4)类似。

来自维基百科:SHA-1

于 2013-02-09T16:13:29.373 回答