密码学基础知识(六)Hash函数与消息认证

来源:互联网 发布:美工使用的软件 编辑:程序博客网 时间:2024/06/10 19:25

Hash函数和消息认证

先说Hash

哈希函数,可以将任意长度的消息压缩为某一固定长度的消息摘要函数。一句话,Hash简直了。

当然有逆天的一面就有大缺点,过程不可逆。傻了吧,哈哈。

Hash的性质:

1.    (逆天特性)应用于任意长的消息,产生固定长的输出(散列值,消息摘要,数字指纹随便你叫什么了);

2.    (单向性)对于给定消息x,H(x)很容易得出。但是对于给定z,寻找H(x)=z是不可行的;

3.    (安全特性)抗弱碰撞性:有x,找一个y,使得H(x)=H(y)计算不可行;抗强碰撞性:寻找(x,y),使得使得H(x)=H(y)计算不可行。

4.    (雪崩性)雪崩效应,散列值的每一位都与消息的每一位有关,相近的消息,输出很大差别。

Hash:

       带密钥的Hash和不带密钥的Hash。区别在于前者一个输入,后者两个:消息+密钥。后者一般用于产生消息认证码MAC。

Hash应用:

1.数据完整性验证:由于雪崩性,稍有改动一对比就发现了;2.产生数字签名:计算H(m),然后私钥加密;3.密钥推导:天生单向性;4.伪随机数生成。

简单说下Hash函数的攻击方法:

       第一类生日攻击:

              就是说,n个输入,其中有一个输出H(x),那我要多少个y才能使H(y)=H(x)的概率达到0.5?

              答案是2/n个。假如输出为m位长,那么就有2m个输出。引出了第二类生日攻击

       第二类生日攻击:

              k~=2m/2,说明了散列值不能小于128位啊。

       模差分攻击:

              最有效的方法,也叫比特追踪法。这个假期研究研究。

 

再额外提下基于分组密码的Hash函数:

       可以用CBC和CFB。

由于这种基于加密体制的Hash函数经不起攻击,所以大多都用另一类,即构造复杂的非线性关系实现单向性。这就产生了那些著名的算法和那些著名的事。

 

MD5算法:

       输入消息:长度小于264,以512位一组。

       输出消息:128位

过程:

1.消息填充:将消息长度填充至差64位就是512的倍数。那64位是表示填充长度的,是先从低位表示填充长度的。

       2.填充后的消息是512的倍数,然后按512分组,每组又是16个32位长的字。

       3.初始化中间结果:128位的缓存区来存储中间结果,对其初始化4个32位长的寄存器分别存放四个固定的整数。

       4.迭代压缩:每个分组经压缩函数HMD5处理。

                     那就说说这个压缩函数,HMD5有四轮处理,四个轮函数结构相同但是逻辑函数不同。

5.    输出:最后一个HMD5的输出即为消息摘要。

 

HMD5

       四轮处理过程,每轮都对缓冲区16轮迭代运算。

 

SHA:

       与MD5一脉相承,来自MD4,真名SHA-1。

       输入消息:长度小于264,以512位一组。

       输出消息:160位

过程:

1.消息填充:(跟MD5一样)将消息长度填充至差64位就是512的倍数。那64位是表示填充长度的,是先从位表示填充长度的。

       2.填充后的消息是512的倍数,然后按512分组,每组又是16个32位长的字。

       3.初始化中间结果:160位的缓存区来存储中间结果,对其初始化5个32位长的寄存器分别存放五个固定的整数。

       4.迭代压缩:四轮处理,每轮20迭代,也是逻辑函数不同

5.  输出:最后一个分组的输出即为160位的消息摘要。

 

在压缩函数上看两者区别:

       MD5直接用分组的16个字作为迭代,SHA则将16字扩展为80字。

 

MD5和SHA算法必然相似,哥俩嘛,

 

 

消息认证码MAC:

       验证信息来源的真实性;验证消息的完整性。

 

很显然,Hash函数很适合设计MAC。所以有了HMAC:

       累了,休息一会。



0 0