一、单向Hash函数
单向Hash函数有很多名字:压缩函数、缩短函数、消息摘要、指纹、密码校验和、信息完整性检验(DIC)、操作检验码(MDC)。不管你怎么叫,它是现代密码学的中心。单向Hash函数是许多协议的另一个结构模块。
Hash函数长期以来一直在计算机科学中使用,无论从数学上或别的角度看,Hash函数就是把可变输入长度串(叫做预映射,Pre-image)转换成固定长度(经常更短)输出串(叫做hash值)的一种函数。简单的Hash函数就是对预映射的处理,并且返回由所有输入字节异或组成的一字节。
这儿的关键就是采集预映射的指纹:产生一个值,这个值能够指出候选预映射是否与真实的预映射有相同的值。因为Hash函数是典型的多到一的函数,我们不能用它们来确定两个串一定相同,但我们可用它来得到准确性的合理保证。
单向Hash函数是在一个方向上工作的Hash函数,从预映射的值很容易计算其Hash值,但要产生一个预映射的值使其Hash值等于一个特殊值却是很难的。好的hash函数也是无冲突的:难于产生两个预映射的值,使他们的hash值相同。
Hash函数是公开的,对处理过程不用保密。单向hash函数的安全性是它的单向性。无论怎么看,输出不依赖于输入。预映射单个比特的改变,平均而言,将引起hash值中一半的比特改变。已知一个hash值,要找到预映射的值,使它的hash值等于已知的hash值在计算上是不可行的。
二、哈希函数
即对于任意长度的信息m,经过哈希函数运算后,压缩后固定长度的数,比如64比特HASH函数的特殊要求是:
1. 已知哈希函数的输出,要求它的输入是困难的,即已知c=Hash(m),求m是困难的。这表现了函数的单向性。
2. 已知m,计算Hash(m)是容易的。这表现了函数的快速性。
3. 已知,构造m2使Hash(m2)=c1是困难的。这是函数的抗碰撞性。
4. c=Hash(m),c的每一比特都与m的每一比特有关,并有高度敏感性。即每改变m的一比特,都将对c产生明显影响。这就是函数的雪崩性。
5. 作为一种数字签名,还要求哈希函数除了信息m自身之外,应该基于发信方的秘密信息对信息m进行确认。
6. 接受的输入m数据没有长度限制;对输入任何长度的m数据能够生成该输入报文固定长度的输出;
曾有数家统计计算结果表明,如hash(m)的长度为128位(bit)时,则任意两个分别为M1.M2的输入报文具有完全相同的h(m)的概率为10-24,即近于零的重复概率。它较人类指纹的重复概率10-19还要小5个数量级。而当我们取hash(m)为384(bit)乃至1024(bit)时,则更是不大可能重复了。
另外,如输入报文M1与输入报文M2全等,则有h(m1)与h(m2)全等,如只将M2或M1中的某任意一位(bit)改变了,其结果将导致h(m1)与h(m2)中有一半左右对应的位(bit)的值都不相同了。这种发散特性使电子数字签名很容易发现(验证签名)输入报文的关键位的值被人篡改了。