密码学|杂凑算法

杂凑算法

概述

(本章内容疑似在本学期课程不需要具体掌握)

保护数据完整性

无密钥杂凑函数MDC:哈希函数

有密钥杂凑函数MAC:消息认证码

应用

MAC

数字签名

随机数产生器

安全性

抗原像性:

由\(y=h(x)\)计算\(x\)是困难的

抗第二原像性(抗弱碰撞性):

已知\(x,y=h(x)\)求\(x',h(x')=h(x)\)是困难的

第一类生日问题

抗强碰撞性

求任意\(x,x'\)使得\(h(x')=h(x)\)是困难的

第二类生日问题

迭代Hash函数结构

Merkle-Damgard (MD)迭代结构。

初始填充 (Padding)

原始消息 M 的长度任意

进行填充

在消息末尾添加一个'1'比特。

然后添加足够多的'0'比特,使得填充后的消息长度满足特定的要求

在填充比特中放入原始消息的长度。保留了消息的长度信息,防止攻击者通过截断消息来制造冲突

填充后的消息记为 M'。

初始向量 (Initialization Vector, IV)

固定长度的初始向量 IV。压缩函数处理第一个消息块的起始状态。

IV 的长度等于压缩函数的输出长度(也就是最终哈希值的长度)

迭代压缩 (Iterative Compression)

填充后的消息 M' 分割成固定长度的块:

M' = M1 || M2 || ... || Mn

压缩函数 f: (State, Block) -> State。

它接收两个输入:当前的状态和一个消息块,并输出一个新的状态值

压缩函数的设计需要是单向的、抗碰撞的、抗第二原像的。

迭代过程:

初始化: 设置当前状态 H0 = IV。

第一轮: 计算第一个消息块 M1 与初始状态 H0 的压缩结果:H1 = f(H0, M1)。

后续轮次: 对于第 i 轮 (i = 2, 3, ..., n),使用前一轮的状态和当前的消息块计算新的状态:Hi = f(Hi-1, Mi)。

这个过程就像一个链:每个新的状态都依赖于前一个状态和当前的消息块。消息块的信息被逐步“吸收”到状态中。

输出 (Output):

处理完所有 n 个消息块后,最终的哈希值就是最后一个状态 Hn

雪崩效应 (Avalanche Effect):

压缩函数 f 被设计成具有强烈的雪崩效应,即输入的微小变化(哪怕只有一个比特)都会导致输出的巨大、不可预测的变化。这使得整个 MD 结构能够将输入消息的任何微小改动都放大到最终的哈希值上。

状态扩散: 每个消息块不仅影响其直接处理后的状态,还通过链式反应影响后续所有块的处理结果。这使得改变消息中的一个块会影响到最终哈希值。

优点缺点

简单高效: 结构相对简单,易于实现和理解。

处理任意长度输入: 通过分块处理和填充机制,可以处理任意长度的消息。

并行化潜力: 虽然标准的 MD 结构是串行的(必须按顺序处理块),但压缩函数 f 本身的设计可以具有并行性。

长度扩展攻击: 如上所述,这是一个严重的安全隐患。

结构依赖性: 如果压缩函数 f 存在漏洞,可能会影响到整个哈希函数的安全性。历史上,MD5 和 SHA-1 的破解都部分利用了其结构特性和压缩函数的弱点。

MD5

将任意长度消息压缩为128比特长哈希值

压缩函数(轮函数)有4轮,每轮16步。

明文分组512比特被分成16个分组,每个分组32比特(1个字),每轮(16步)以不同的次序使用16个字

轮函数使用128比特长的缓冲区(4个寄存器A、B、C、D,每个32比特)来存取中间结果和最终Hash值,寄存器有初值

轮函数的结构一样,使用的非线性逻辑函数f不同,f输入3个32比特,输出32比特,每轮均对缓冲区A、B、C、D进行16步迭代更新

轮常数: 64个元素(4轮,每轮16步)

HMAC

利用Hash 构造MAC。两个输入:消息+密钥 没有密钥不能计算摘要;实现消息认证。

\(HMAC(x) = h(k || p1|| h(k || p2|| x))\)

其中需要计算两次MD,x为原输入消息, 𝒑𝟏、𝒑𝟐为将k填充为整块(MD消息块长度)的常数串。