几个月前介绍的数字签名实现了报文鉴别的三个需求,在这里把这三个需求再列在下面:
1.报文鉴别,接收者能够确认该报文一定是发送者发送的
2.报文完整性,接收者能够确认报文是完整的,没有被第三方篡改
3.不可否认,发送者不能对发送的报文进行抵赖

我们很容易想到,这三个特性在现实生活中的实例,其实就是盖章和亲笔签名的使用,在网络安全的应用就是数字签名。

但是对于较长的报文来说,使用数字签名会给计算机带来较大的开销。为了减少签名和核实签名的计算开销,我们可以使用一种叫做密码散列函数的东西

散列函数的两个特点:
1.散列函数的输入可以很长,但是输出长度则是固定的,并且较短。散列函数的输出叫做散列值。
2.不同的散列值肯定对应这不同的输入,但是不同的输入却可能得出相同的散列值,也就是说,输入和散列值是多对一的关系。

还有一个重要的特点:要找到两个不同的报文,他们具有相同的密码散列函数输出,在计算上是不可行的。这就意味着密码散列函数是一种单向函数。

一个场景:如果我们固定长度的散列值被截获了,截获者也不能伪造出另一个明文,使得这个明文通过散列函数的输出和截获的散列值相等。散列函数可以保证报文的完整性

实用的密码散列函数MD5和SHA-1
MD5曾猜想,根据给定的MD报文摘要码,要找出一个与原来报文有相同报文摘要的另一报文,其难度在计算上几乎是不可能实现的,但是中国学者王小云在2004年发表论文证明可以用系统的方法找出一对报文,这对报文具有相同的MD5报文摘要,仅需15分钟或者不到一小时。
随后便出现了代替MD5的安全散列算法SHA-1

这里以MD5为例介绍报文摘要,因为目前新的散列函数都是由MD5发展而来的。

MD5算法的大致过程
1.把任意长的报文按模图片说明 计算其余数(64位),追加在报文的后面。
2.在报文和余数之间填充1~512位,使得填充后的总长度是512的整数倍。填充的首位是1,后面都是0
3.把追加和填充后的报文分割为一个个512位的数据块,每个512位的报文数据再分成4个128位的数据块一次送到不同的散列函数进行4轮计算,每一轮又都按32位的小数据块进行复杂的运算,一直到最后计算出MD5报文摘要代码(128位)