本文源自对《图解密码技术》第七章单向散列函数的解读
斜体部分为自己的思考。
概念
单向散列函数有一个输入和一个输出,其中输入称为消息,输出称为散列值。
单向散列函数的性质
*第一条、*根据任意长度的消息计算出固定长度的散列值。
*第二条、*能够快速计算出散列值。
*第三条、*消息不同散列值也不同。
第一条和第二条好解决,但是第三条却只能在有限的范围内实现。更可以说第一条和第三条是逻辑互斥的。
以书中提到的SHA-1单向散列函数为例,计算出的散列值长度永远是160比特(20个字节)。那就只能表现 2的160次方(1.4615016373309e+48)个散列值。如果不考虑有限范围,出现相同的散列值的不同消息是必然的(如果有1.4615016373309e+48+1个文件,那这个文件必然与前面的1.4615016373309e+48中的某个文件的散列值是相同的)。
两个不同的消息产生同一个散列值的情况称为碰撞。 只要散列值的长度是固定的,那碰撞是必然的。
难以发现碰撞的性质称为抗碰撞性。正是因为在有限的范围内碰撞是必然的,所才有抗碰撞性可言。
当给定某条消息的散列值时,单向散列函数必须确保要找到和该条消息具有相同散列值的另外一条消息是非常困难的。这一性质称为弱抗碰撞性。单向散列函数必须具备弱抗碰撞性。
和弱抗碰撞性相对的,还有强抗碰撞性。所谓强抗碰撞性,是指要找到散列值相同的两条不同的消息是非常困难的这一性质。密码技术中所使用的单向散列函数,不仅要具备弱抗碰撞性,还必须具备强抗碰撞性。
理解弱抗碰撞性和强抗碰撞性最好的方法是学习针对它们的攻击方式。