【密码学】哈希函数-SHA

版权声明:欢迎转载,但请注明出处! https://blog.csdn.net/DavidHuang2017/article/details/80441386

一、哈希函数

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实现


猜你喜欢

转载自blog.csdn.net/DavidHuang2017/article/details/80441386
今日推荐