单向函数
特点:正向很容易 逆向很难
定义:函数f:{0,1}*->{0,1}*若满足下列两个条件,则称之为强单向函数:
1.计算f(x)是容易的,即f(x)是多项式时间可计算的
2.计算f函数的逆f-1(x)是困难的,即对每一多项式时间概率算法M,每一多项式p(n)和充分大的n(n>n0)有
Pr{M(f(Un)∈f-1(f(Un))}<1/p(n)
Hash码
把任意长变消息为固定长短的Hash码(信息摘要)
Hash码有很强的的错误检测能力,即改变数据的任何一位或多位,都将极大可能改变其Hash码。
Hash码与数据紧密联系,很好地反映着数据的真实性和完整性,因此人们把Hash码称为数据的‘指纹’。
Hash码是从数据压缩而成的,长度比数据的长度小的多,所以人们称Hash码为数据的‘摘要’。
Hash函数
定义为h=H(M)
Hash函数要满足如下安全性条件:
单向性(抗原像):对若干给定的消息,计算其哈希值容易.但是,对于给定的哈希值h,要找到M使得H(M)=h在计算上是不可行的。
弱抗碰撞(抗二次原像):对于给定的消息M1,要发现另一个消息M2,满足H(M1)=H(M2)在计算上是不可行的。
强抗碰撞:找任意一对不同的消息M1,M2,使H(M1)=H(M2)在计算上是不可行的。
随机性:Hash函数的输出具有伪随机性。
Hash函数的用途:
消息完整性检测
消息源认证码
数字签名 1.自己签很容易 2.别人很难模仿 3.一旦有纠纷 能被鉴别
Hash链可以用于口令认证(身份鉴别)
比特承诺等密码协议
Hash函数的实际用法:
1.用于认证
A->B:
A->B:
2.用于认证和保密
A->B:
A->B:
3.用于认证和数字签名
A->B:
4.用于认证、数字签名和保密性
A->B:
解释:M-数据
H(M)-M的Hash值
x||y-表示收尾相接
K-对称密钥
S-双方共享的秘密值
KdA-私钥
Hash函数的一般结构
首先将输入数据分为L-1个大小为b的分组。如果第L-1个分组不足b位,则将其填充为b位。然后再附加上一个表示输入总长度的分组。由于输入包含长度,所以攻击者如果想要攻击成功,就必须找出具有相同Hash值且长度相等的两条数据,或者找出两条长度不等但加入数据长度后Hash值相同的长度,从而增加了攻击的难度。
这类Hash函数的一般结构可归纳如下:
CV0=IV=n位的初始值
CVi=f(CVi-1,Mi-1) 1<=i<=L
H(M)=CVL
Hash函数的输入为数据M,由L个分组M0,M1,M2,...,ML-1组成。
f为压缩函数,其输入是前一步中得出的n为中间结果CVi-1(也称为链接变量)和一个b位数据分组Mi-1,输出位一个n位结果CVi。 由于通常b>n,所以f称为压缩函数。
最后的迭代压缩结果为Hash码CVL。