赞
踩
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 SHA2−256算法.
输入任意长度的信息,以** 512 b i t 512bit 512bit输入数据块**为单位,输出为 128 b i t 128bit 128bit的信息(数字指纹)。
1、补位。使输入信息的长度变为 ( N ∗ 512 + 448 ) b i t (N*512+448)bit (N∗512+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 N∗512bit的.
需要注意的是,补位操作必须进行,即使最初信息的长度已经满足 ( N ∗ 512 + 448 ) b i t (N*512+448)bit (N∗512+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的散列值。
对于长度小于 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是初始消息的长度
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\{
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=(W13⨁W8⨁W2⨁W0)<<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\{
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\{
∙ \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的最终结果。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。