当前位置:   article > 正文

哈希函数-MD5、SHA1_md5 sha1

md5 sha1

定义

H a s h Hash Hash,一般译作散列、哈希,就是能把任意长度的输入(又做预映射)通过散列算法,变换成固定长度的输出,这个输出就是散列值。

散列值通常是数字和字母的组合。

性质

1、不可逆性。已知哈希函数 F F F x x x哈希值,无法逆向求出 x x x.

2、对于特定的哈希函数,只要输入不变,那么散列值也肯定是唯一不变的.

3、哈希函数产生的映射应当保持均匀,即不要使得映射结果堆积在小区间的某一区域.

4、敏感性。哪怕输入数据只改变 1 b i t 1bit 1bit,得到的哈希值也大不相同.

5、抗碰撞性。理想 H a s h Hash Hash函数是无碰撞的,但实际很难做到这一点。有两种抗碰撞性:弱抗碰撞性、强抗碰撞性.

典型的哈希函数

常见的 H a s h Hash Hash算法有 M D 5 MD5 MD5 S H A SHA SHA系列,目前 M D 5 MD5 MD5 S H A 1 SHA1 SHA1已被破解,一般推荐使用 S H A 2 − 256 SHA2-256 SHA2256算法.

MD5

输入任意长度的信息,以** 512 b i t 512bit 512bit输入数据块**为单位,输出为 128 b i t 128bit 128bit的信息(数字指纹)。

实现过程

1、补位。使输入信息的长度变为 ( N ∗ 512 + 448 ) b i t (N*512+448)bit (N512+448)bit,补位内容为 100...0 100...0 100...0

​ 那为什么不补为 512 b i t 512bit 512bit的整数倍呢?其实剩余 64 b i t 64bit 64bit是原始信息的长度。也就是说,补位最终结果是 N ∗ 512 b i t N*512bit N512bit.

​ 需要注意的是,补位操作必须进行,即使最初信息的长度已经满足 ( N ∗ 512 + 448 ) b i t (N*512+448)bit (N512+448)bit,但还是要加上 512 b i t 512bit 512bit,然后再补 64 b i t 64bit 64bit记录原始

​ 信息长度. 如下图: 在这里插入图片描述

2、分割。把结果分为n组,每一组长度为 512 b i t 512bit 512bit.

3、计算

∙ \bullet 准备四个标准幻数,每一个数4个字节,总的16字节。其实四个幻数的值定义也很直接,就是32个16进制字面值依次排列

分别是:

A = 01234567 A = 01234567 A=01234567 B = 89 A B C D E F B = 89ABCDEF B=89ABCDEF C = F E D C B A 98 C = FEDCBA98 C=FEDCBA98 D = 76543210 D = 76543210 D=76543210

那么,这四个幻数是用来做什么的呢?

其实不难发现,四个幻数的长度和 M D 5 MD5 MD5散列值的长度都是 128 b i t 128bit 128bit,四个幻数就是用来做循环初始计算值的

最终 M D 5 MD5 MD5散列值就是四个标准幻数经过多轮哈希运算的结果

需要注意,在程序中,幻数是用小端字节表示的,即

A = 0 x 67452301 A = 0x67452301 A=0x67452301 B = 0 x E F C D A B 89 B = 0xEFCDAB89 B=0xEFCDAB89 C = 0 x 98 B A C D F E C = 0x98BACDFE C=0x98BACDFE D = 0 x 10325476 D = 0x10325476 D=0x10325476

准备工作完成,就可以开始计算了。

∙ \bullet 数据被分为n个 512 b i t 512bit 512bit,也就是n个64字节,再把每一个64字节分成16份,每份四个字节。

在这里插入图片描述

∙ \bullet 定义四个函数,分别是
F F ( A , B , C , D , X , S , A C ) FF(A,B,C,D,X,S,AC) FF(A,B,C,D,X,S,AC)

G G ( A , B , C , D , X , S , A C ) GG(A,B,C,D,X,S,AC) GG(A,B,C,D,X,S,AC)

H H ( A , B , C , D , X , S , A C ) HH(A,B,C,D,X,S,AC) HH(A,B,C,D,X,S,AC)

I I ( A , B , C , D , X , S , A C ) II(A,B,C,D,X,S,AC) II(A,B,C,D,X,S,AC)

前四个参数分别对应四个标准幻数,第五个参数是每一小份的四个字节数据,第六个和第七个参数都是一些固定常数,执行一些逻辑与、或、非、异或运算,加法运算和移位运算。

∙ \bullet 将四个标准幻数换着顺序作为前四个参数输入,并将16份4字节数据依次作为第五个参数代入,经过这么一轮运算,四个标准幻数的值就变了。
在这里插入图片描述
∙ \bullet 将四个标准幻数与一开始的值相加,得到更新后的四个幻数结果。这样就处理完了一个64字节的数据。

∙ \bullet 四个更新后的标准幻数作为第二轮的四个标准幻数输入,并且载入第二个64字节数据中进行运算。

∙ \bullet 重复上述过程,直到n个64字节数据全部计算完成,最终得到的四个标准幻数用十六进制显示出来就是最终 M D 5 MD5 MD5的散列值。

SHA1(Secure Hash Algorithm)

对于长度小于 2 64 b i t 2^{64}bit 264bit的消息,将输入流按照每块 512 b ( 64 B ) 512b(64B) 512b(64B)进行分块,并产生 160 b ( 20 B ) 160b(20B) 160b(20B)的信息摘要。在这里插入图片描述

实现过程

大致框图:
在这里插入图片描述

1、补位。(与 M D 5 MD5 MD5补位是一样的)

第一位:补1
其余位:补0
直至满足 L mod 512 = 448

512 - 448 = 64
剩余64bit是初始消息的长度
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

eg:在这里插入图片描述

2、将信息分为 n n n 512 b i t 512bit 512bit

3、每个 512 b 512b 512b的运算。

∙ \bullet 512 b 512b 512b分为 26 26 26 32 b 32b 32b,将 16 16 16扩充 80 80 80份.
在这里插入图片描述
那么,如何扩充呢?
W t = { M t i    0 ⩽ t ⩽ 15 R O T L 1 ( W t − 3 ⨁ W t − 8 ⨁ W t − 14 ⨁ W t − 16 )    16 ⩽ t ⩽ 79 W_{t}=\left\{

Mti  0t15ROTL1(Wt3Wt8Wt14Wt16)  16t79
\right. Wt={Mti  0t15ROTL1(Wt3Wt8Wt14Wt16)  16t79
R O T L 1 ROTL^{1} ROTL1表示左移一位.

eg:
W 16 = ( W 13 ⨁ W 8 ⨁ W 2 ⨁ W 0 ) < < 1 W_{16}=(W_{13}\bigoplus W_{8}\bigoplus W_{2}\bigoplus W_{0})<<1 W16=(W13W8W2W0)<<1
∙ \bullet 设置 5 5 5个初始量,
H 0 ( 0 ) = 67452301 H_{0}^{(0)}=67452301 H0(0)=67452301

H 1 ( 0 ) = e f c d a b 89 H_{1}^{(0)}=efcdab89 H1(0)=efcdab89

H 2 ( 0 ) = 98 b a d c f e H_{2}^{(0)}=98badcfe H2(0)=98badcfe

H 3 ( 0 ) = 10325476 H_{3}^{(0)}=10325476 H3(0)=10325476

H 4 ( 0 ) = c 3 d 2 e 1 f 0 H_{4}^{(0)}=c3d2e1f0 H4(0)=c3d2e1f0

∙ \bullet 将初始量的值分别赋给 a , b , c , d , e a,b,c,d,e a,b,c,d,e
a = H 0 ( 0 ) a=H_{0}^{(0)} a=H0(0)

b = H 1 ( 0 ) b=H_{1}^{(0)} b=H1(0)

c = H 2 ( 0 ) c= H_{2}^{(0)} c=H2(0)

d = H 3 ( 0 ) d = H_{3}^{(0)} d=H3(0)

e = H 4 ( 0 ) e = H_{4}^{(0)} e=H4(0)

∙ \bullet 进行 80 80 80轮运算.

f o r   t = 0   t o   79 : for \textbf{ }t = 0 \textbf{ }to\textbf{ } 79: for t=0 to 79:
{ \left \{ \right. {
T = R O T L 5 ( a ) + f t ( b , c , d ) + e + K t + W t T = ROTL^{5}(a)+f_{t}(b,c,d)+e+K_{t}+W_{t} T=ROTL5(a)+ft(b,c,d)+e+Kt+Wt

e = d e=d e=d

d = c d=c d=c

c = R O L T 30 ( b ) c=ROLT^{30}(b) c=ROLT30(b)

b = a b = a b=a

a = T a=T a=T
} \left. \right \} }
其中,
K t = { 5 a 827999    0 ⩽ t ⩽ 19 6 e d 9 e b a 1    20 ⩽ t ⩽ 39 8 f 1 b b c d c    40 ⩽ t ⩽ 59 c a 62 c 1 d 6    60 ⩽ t ⩽ 79 K_{t}=\left\{

5a827999  0t196ed9eba1  20t398f1bbcdc  40t59ca62c1d6  60t79
\right. Kt=5a827999  0t196ed9eba1  20t398f1bbcdc  40t59ca62c1d6  60t79

f t ( x , y , z ) = { C h ( x , y , z ) = ( x ∧ y ) ⨁ ( x ∧ z ) ,    0 ⩽ t ⩽ 19 P a r i t y ( x , y , z ) = x ⨁ y ⨁ z ,    20 ⩽ t ⩽ 39 M a j ( x , y , z ) = ( x ∧ y ) ⨁ ( x ∧ z ) ⨁ ( y ∧ z ) ,    40 ⩽ t ⩽ 59 P a r i t y ( x , y , z ) = x ⨁ y ⨁ z ,    60 ⩽ t ⩽ 79 f_{t}(x,y,z)=\left\{

Ch(x,y,z)=(xy)(xz),  0t19Parity(x,y,z)=xyz,  20t39Maj(x,y,z)=(xy)(xz)(yz),  40t59Parity(x,y,z)=xyz,  60t79
\right. ft(x,y,z)=Ch(x,y,z)=(xy)(xz),  0t19Parity(x,y,z)=xyz,  20t39Maj(x,y,z)=(xy)(xz)(yz),  40t59Parity(x,y,z)=xyz,  60t79

∙ \bullet 80 80 80轮运算之后得到的 a , b , c , d , e a,b,c,d,e a,b,c,d,e分别与初始量相加.

∙ \bullet 将上述结果作为第二个 512 b 512b 512b的初始量进行循环计算。

∙ \bullet 重复上述过程,直到 n n n 512 b 512b 512b数据全部计算完成,最终得到的 a , b , c , d , e a,b,c,d,e a,b,c,d,e就是 S H A 1 SHA1 SHA1的最终结果。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/515492
推荐阅读
  

闽ICP备14008679号