密码学|杂凑算法
杂凑算法
概述
(本章内容疑似在本学期课程不需要具体掌握)
保护数据完整性
无密钥杂凑函数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消息块长度)的常数串。

浙公网安备 33010602011771号