MD结构¶
来源:
密码学引论 / hash_function/MD结构.md
在密码学中,Merkle-Damgård 构造或Merkle-Damgård 哈希函数是一种利用抗碰撞单向压缩函数构建抗 碰撞加密哈希函数的方法。:145 这种构造被用于设计许多流行的哈希算法,例如MD5、SHA-1和SHA-2。 Merkle-Damgård 构造由Ralph Merkle于1979 年在其博士 论文中提出。Ralph Merkle 和Ivan Damgård分别独立证明了该结构的可靠性:也就是说,如果使用合适的填充方案并且压缩函数是抗碰撞的,那么哈希函数也将是抗碰撞的。[
Merkle-Damgård 哈希函数首先应用符合 MD 规范的填充函数,生成一个长度为固定数字倍数(例如 512 或 1024)的输入——这是因为压缩函数无法处理任意长度的输入。然后,哈希函数将结果分割成固定长度的数据块,并逐个使用压缩函数进行处理,每次处理都将输入块与上一轮的输出合并。为了确保构造的安全性,Merkle 和 Damgård 提出使用长度编码的填充来填充消息。这被称为_长度填充_或_Merkle-Damgård 强化_。
Merkle–Damgård 哈希构造
在图中,单向压缩函数用_f_表示,它将两个固定长度的输入转换为与其中一个输入长度相同的输出。该算法从一个初始值(初始化向量(IV))开始。IV 是一个固定值(算法或实现特定)。对于每个消息块,压缩(或精简)函数_f_会获取当前的结果,将其与该消息块合并,并生成一个中间结果。最后一个消息块会根据需要用零填充,并附加表示整个消息长度的位。(有关详细的长度填充示例,请参见下文。)
为了进一步增强哈希的安全性,有时会将最终结果输入到_终结函数_中。终结函数可以有多种用途,例如将较大的内部状态(最终结果)压缩成较小的输出哈希值,或者确保哈希和中的比特更好地混合和雪崩效应。终结函数通常使用压缩函数构建。(请注意,在某些文档中使用了不同的术语:长度填充操作被称为“终结”。