这篇文章上次修改于 2019 天前,可能其部分内容已经发生变化,如有疑问可询问作者。
7.单向散列函数
单向散列函数(one-way hash function)
有一个输入和一个输出,输入称为消息(message),输出称为散列值(hash value)
单向散列函数的性质:
- 根据任意长度的消息计算出固定长度的散列值
- 能够快速计算出散列值
- 消息不同散列值也不同
碰撞(collision): 两个不同的消息产生同一个散列值的情况
抗碰撞性(collision resistance): 难以发现碰撞的性质称为抗碰撞性。
单向散列函数必须要确保要找到和该消息具有相同散列值的另外一条消息是非常困难的。这一性质称为弱抗碰撞性。单向散列函数必须具备弱抗碰撞性
强抗碰撞性:要找到散列值相同的两条不同消息是非常困难的,这里的散列值可以是任意值。
密码技术中使用的单向散列函数不仅要具备弱抗碰撞性,还要具备强抗碰撞性。
具备单向性:
单向散列函数也被用于基于口令的加密(password based encryption ,PBE)
PBE的原理是将口令和盐(salt, 通过伪随机数生成器产生的随机值)混合后计算其散列值,然后将这个散列值用作加密的秘钥。
单向散列函数的例子
MD4,MD5:
MD4是1990年Rivest 设计的单向散列函数,能够产生128bit的散列值(RFC1186,修订版RFC1320).
MD5是1991年Rivest设计的单向散列函数,能够产生128bit的散列值(RFC1321)
MD5的强抗碰撞性已经被攻破,现在已经能够产生具备相同散列值的两条不同消息。
SHA1 SHA256 SHA384 SHA512
SHA-1是NIST 设计的一种能够产生160bit的散列值的单向散列函数。 (强抗碰撞性于2005年被攻破)
SHA-256, SHA-384,SHA-512都是NIST设计的单向散列函数,散列长度分别为256,384,512bit,这些散列函数统称为SHA-2(尚未攻破)
RIPEMD-160
RIPEMD-160是于1996年设计的一种能够产生160bit的单向散列函数,欧盟RIPE项目设计的RIPEMD单向散列函数的修订版
ASH(advanced Hash Standard)与SHA-3
在SHA-1的强抗碰撞性被攻破的背景下,NIST开始着手制定用于SHA-1下一代的单向散列函数SHA-3,和AES一样采用了公开竞赛的方式进行标准化。
单向散列函数SHA-1
整体流程:
根据上限为2^64bit的消息计算出160bit的散落之
1. 填充,对消息进行填充,使其长度为512bit的整数倍,这里的512bit称为一个输入分组。
2. 计算W0 ~ W79,根据输入分组的512bit计算出80个32bit的值
3. 分组处理, 对输入分组依次进行80个步骤的处理,计算5个32bit的值,(A~E)作为SHA-1的内部状态, 对所有的分组都要进行这一操作。
- 单步处理是由80个步骤的处理组成的,其中每个步骤基于W0~W79使其内部状态进行复杂变化的处理。
1. 填充
例如Hello
(a) 添加1 ,在消息末尾添加1bit的数值1,
(b) 添加0 , 在纤细末尾添加0,知道消息长度达到512的整数倍,但是最后一个分组的最后64bit需要空出来保存原始的消息长度。
(c) 添加消息长度
2. 计算W0 ~ W79
完成填充之后,以输入分组为单位进行下面的处理。
现将输入分组的512bit分成32*16组,并命名为W0~W15,然后剩下的W16 ~ W79计算方法如下,:
W16 = (W0 ⊕ W2 ⊕ W8 ⊕ W13)循环左移1bit
可以用一般公式表示:
Wt = (W(t-16) ⊕ W(t-14) ⊕ W(t-8) ⊕ W(t-3))循环左移1bit
一般形式:
没有评论