哈希函数

单向函数

特点:正向很容易 逆向很难

定义:函数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:<M||E(H(M),K)>

A->B:<M||H(M||S)>

2.用于认证和保密

A->B:<E(M||H(M),K)>

A->B:<E(M||H(M||S),K)>

3.用于认证和数字签名

A->B:<M||D(H(M),KdA)>

4.用于认证、数字签名和保密性

A->B:<E(M||D(H(M),KdA),K)>

 

解释: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

 

posted @ 2020-05-11 17:28  SjYu  阅读(1013)  评论(0编辑  收藏  举报