一、哈希函数
1.定义:
Hash函数将长度可变的数据块M作为输入,产生固定长度的Hash值h=H(M)。
2.特征:
(1)固定长度输入,可变长度输出;
(2)不可逆;
(3)小概率发生碰撞,只能减少碰撞概率,无法避免碰撞;
3.应用:
(1)消息认证;
(2)数字签名;
(3)登陆认证;
(4)入侵检测和病毒检测;
(5)构建伪随机函数和作为伪随机数发生器;
4.密码学Hash函数的安全性需求:
(1)固定长度输入,可变长度输出;
(2)效率高:哈希过程简单;
(3)不可逆;
(4)伪随机性:输出
(5)抗弱碰撞性:对给定的x,找到满足H(x)=H(y)且x≠y在计算上是不可行的;
(6)抗强碰撞性:找到任何满足H(x)=H(y)的数对(x,y)计算上是不可行的;
(5)和(6)可以理解为哈希函数碰撞是小概率事件。
二、SHA算法原理
上表中除了SHA-1外都是SHA-2,另外还有SHA-3。此处重点讲解SHA-512.
SHA-512过程:
输入是最大长度小于2^128的消息,以1024位2为单位进行处理。输出是512位的消息摘要。
下面过程均以bit位单位
1.填充位:
填充消息使其长度mod1204与896同余,即使消息长度已满足要求,任然要填充。填充100000....
在填充块消息后附加一个消息块,表示消息原始长度。因此扩展后的消息长度位N*1024bit。
2.初始化缓冲区:
哈希函数的中间结果和最终结果都存在8个64位寄存器组成的缓冲区里,并将他们初始化为(0x):
a=0x6A09E667F3BCC908
b=0x BB67AE8584CAA73B
c=0x 3C6EF372FE94F82B
d=0x A54FF53A5F1D36F1
e=0x 510E527FADE682D1
f=0x 9B05688C2B3E6C1F
g=0x 1F83D9ABFB41BD6B
h=0x 5BE0CD19137E2179
即IV=H0=(a,b,c,d,e,f,g,h),他们的获取方式:前8个素数的平方根,取小数部分前64位
3.循环轮处理
一共N次循环。每次循环80轮。
(1)消息扩展
前16个Wt直接取自于当前分组的16个字。余下的值:
其中:
为对64位变量x循环右移n位;
为对64位变量x右移n位,左边填充0;
(2)轮常数Kt
(3)轮函数
每一轮由如下方程定义:
T1 = h + Ch(e,f,g) + (∑1512e) + Wt + Kt
T2 = (∑0512a) + Maj(a,b,c)
e = d + T1
a = T1 + T2
h=g
g=f
f=e
d=c
c=b
b=a
其中:
t为步骤数,0≤t≤79
Ch(e,f,g) = (e AND f)⊕(NOT e AND g) 条件函数(位运算):如果e,则f,否则g
Maj(a,b,c) = (a AND b)⊕(a AND c)⊕(b AND c) 当且仅当变量的多数(2个或者3个)为真时函数为真
(∑0512a) = ROTR28(a)⊕ROTR34(a)⊕ROTR39(a)
(∑1512e) = ROTR14(e)⊕ROTR18(e)⊕ROTR41(e)
总结SHA-512运算:
H0=IV;Hi=XOR(abcdefgh,Hi-1);
MD=HN
4.举例
5.对比MD5
除了轮函数不一样,其他过程大致相似。
三、SHA java实现
实现和MD5类似,改参数为SHA即可。
MessageDigest md = MessageDigest.getInstance("MD5");//申明使用MD5算法,更改参数为"SHA"就是SHA算法了
【密码学】MD5原理与java实现