在本文中:
- 模二加,记为
⨁
\bigoplus
⨁:是二进制位的异或操作。如1模二加1和0模二加1都等于0;1模二加0等于1;
-
模
2
32
加
模2^{32}加
模232加,计为
+
+
+:意思是普通加法的结果再进行
模
2
32
加
模2^{32}加
模232加计算。
如
模
2
4
加
模2^4加
模24加. 若,a = 14,b=15,(+)表示
模
2
4
加
模2^4加
模24加
则,
a
(
+
)
b
=
(
a
+
b
)
m
o
d
2
4
=
(
14
+
15
)
m
o
d
16
=
29
m
o
d
16
=
13
a(+)b=(a+b)\;mod \;2^4 = (14+15)mod 16 = 29\;mod\;16=13
a(+)b=(a+b)mod24=(14+15)mod16=29mod16=13
Hash函数
密码学中的Hash函数是将任意长度的消息压缩到某一固定长度的消息摘要的单向函数。它主要用于数字签名和消息的完整性检测。
- 经过hash函数之后的值不可以再恢复成原来的消息;
- 且任意两个不同的消息不可能得到相同的hash值。
- 进入hash函数之前,变更一个字节会导致其hash值较之前截然不同。
MD4
MD5是在MD4的基础上进行更改的,所以二者思想和算法相似。
总
体
步
骤
:
\color{blue}总体步骤:
总体步骤:
- 数字填充,将输入的数据填充为512位的倍数。
- 分组处理,每512位(64字节)位一组,按组进行处理。
- 处理结束后便得到128位的结果。
1
、
数
字
填
充
:
\color{blue}1、数字填充:
1、数字填充:
该步骤仅作用在最后一组不满512位的那一组。
- 在左边填充1
- 之后一直补k个0,使得(n+1+k)
≡
\equiv
≡ 448
m
o
d
mod
mod 512
- 最后追加64位的整数,其内容是数据所占的比特数的大小。
2
、
分
组
处
理
:
\color{blue}2、分组处理:
2、分组处理:
- 把每一个分组X(64个字节)分为16个子分块
x
[
0
]
到
x
[
15
]
x_{[0]}到x_{[15]}
x[0]到x[15](每个有4个字节)
- 将
x
[
0
]
到
x
[
15
]
x_{[0]}到x_{[15]}
x[0]到x[15] 依次同四个寄存器A.B.C.D进行三轮不同的运算。(A、B、C、D都有初始值。)
即,
x
[
0
]
到
x
[
15
]
x_{[0]}到x_{[15]}
x[0]到x[15]先和ABCD进行第一轮运算,(一轮刚好有16个运算,对应着16个子分块x,以下类似。)
之后,
x
[
0
]
到
x
[
15
]
x_{[0]}到x_{[15]}
x[0]到x[15]再与ABCD进行第二轮运算,
最后,
x
[
0
]
到
x
[
15
]
x_{[0]}到x_{[15]}
x[0]到x[15]与ABCD进行第三轮运算。
- 每一轮有16个运算,使得
x
[
0
]
到
x
[
15
]
x_{[0]}到x_{[15]}
x[0]到x[15]每个参加一次运算。
- 每一个运算又分为4步。(F函数、与子分块模
2
32
2^{32}
232加、与常数k模
2
32
2^{32}
232加、循环左移)
下图表示每一轮中每一次的运算过程。
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210620153948865.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ0MTMxODk2,size_16,color_FFFFFF,t_70#pic_center)
上图中,
F函数每一轮会有所不同。
“数据子分块”会随着16次运算的不同,取到
x
[
0
]
到
x
[
15
]
x_{[0]}到x_{[15]}
x[0]到x[15]。
常量k每一轮也会不同。
循环左移操作,每一轮都有他自己的规则。
简
单
讲
,
每
一
轮
中
的
每
一
次
运
算
都
不
相
同
。
简单讲,每一轮中的每一次运算都不相同。
简单讲,每一轮中的每一次运算都不相同。
在
图
中
也
可
以
注
意
到
,
将
运
算
后
的
值
给
了
下
一
次
的
B
,
原
B
给
了
C
,
原
D
给
了
A
。
\color{red}在图中也可以注意到,将运算后的值给了下一次的B,原B给了C,原D给了A。
在图中也可以注意到,将运算后的值给了下一次的B,原B给了C,原D给了A。
a) F函数:
第一轮:
f
(
X
,
Y
,
Z
)
=
(
X
⋀
Y
)
⋁
(
X
‾
⋀
Z
)
f(X,Y,Z)=(X\bigwedge Y) \bigvee(\overline{X}\bigwedge Z)\;
f(X,Y,Z)=(X⋀Y)⋁(X⋀Z) (注:
X
‾
\overline{X}
X表示X的补。)
第二轮:
g
(
X
,
Y
,
Z
)
=
(
X
⋀
Y
)
⋁
(
X
⋀
Z
)
⋁
(
Y
⋀
Z
)
g(X,Y,Z)=(X\bigwedge Y) \bigvee(X\bigwedge Z)\bigvee(Y\bigwedge Z)\;
g(X,Y,Z)=(X⋀Y)⋁(X⋀Z)⋁(Y⋀Z)
第三轮:
h
(
X
,
Y
,
Z
)
=
X
⨁
Y
⨁
Z
h(X,Y,Z)=X\bigoplus Y\bigoplus Z\;
h(X,Y,Z)=X⨁Y⨁Z (注:“
⨁
\bigoplus
⨁”为模二加操作)
b) 与子分块相加:(模
2
32
2^{32}
232加)
每一轮的子分块参加运算的顺序都不相同。
c) 与常数k(16进制)相加:(模
2
32
2^{32}
232加)
第一轮:0
第二轮:5A827999
第三轮:6ED9EDA1
d) 循环左移:
第一轮:第一次运算左移3位,第二次运算左移7位,第三次运算左移11位,第四次运算左移19位,第五次运算同第一次运算一样左移3位,依次往复循环。
第二轮:以左移3、5、9、13进行循环
第三轮:以3、9、11、15循环左移
A、B、C、D的初始值
A:67452301 (4byte)
B:EFCDAB89 (4byte)
C:98BADCFE (4byte)
D:10325476 (4byte)
先
介
绍
生
成
流
程
,
3
轮
的
16
次
运
算
放
在
最
后
面
给
出
。
\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\color{gray}先介绍生成流程,3轮的16次运算放在最后面给出。
先介绍生成流程,3轮的16次运算放在最后面给出。
3
、
得
到
128
b
i
t
的
输
出
:
\color{blue}3、得到128bit的输出:
3、得到128bit的输出:
经过3轮最终得到的A、B、C、D与初值A、B、C、D分别进行
模
2
32
加
模2^{32}加
模232加运算后,将得到的结果进行合并,就得到了最终的128位(16字节)。
MD5
MD5和MD4的核心思想和算法都是一样的,二者的主要区别在于:
- 增加第四轮F函数,为:
I
(
X
、
Y
、
Z
)
=
(
X
⋁
Z
‾
)
⨁
Y
I(X、Y、Z)=(X\bigvee {\overline{Z}})\bigoplus Y\;
I(X、Y、Z)=(X⋁Z)⨁Y (注:
X
‾
\overline{X}
X表示X的补。)
- 第二轮F函数由
g
(
X
,
Y
,
Z
)
=
(
X
⋀
Y
)
⋁
(
X
⋀
Z
)
⋁
(
Y
⋀
Z
)
g(X,Y,Z)=(X\bigwedge Y) \bigvee(X\bigwedge Z)\bigvee(Y\bigwedge Z)
g(X,Y,Z)=(X⋀Y)⋁(X⋀Z)⋁(Y⋀Z) 变为
g
(
X
,
Y
,
Z
)
=
(
X
⋀
Y
)
⋁
(
Y
⋀
Z
‾
)
g(X,Y,Z)=(X\bigwedge Y) \bigvee(Y\bigwedge \overline{Z})
g(X,Y,Z)=(X⋀Y)⋁(Y⋀Z)
- 第二、三轮的子分块
x
[
0
]
到
x
[
15
]
x_{[0]}到x_{[15]}
x[0]到x[15]的次序被改变
- 第一轮的移位数发生改变
- 每一步都有一个唯一的加法常量k(16步有16个)
- 每一步都要加上上一步的结果
总结
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210620174400367.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ0MTMxODk2,size_16,color_FFFFFF,t_70#pic_center)
最后的最后,给出MD4的3轮16次运算过程
第一轮:
-
A
=
(
A
+
f
(
B
,
C
,
D
)
+
x
[
0
]
)
<
<
3
A=(A+f(B,C,D)+x_{[0]})<<3
A=(A+f(B,C,D)+x[0])<<3
解释:
初始
A
\;A\;
A与经过经过第一轮
F
函
数
\;F函数\;
F函数的
B
,
C
,
D
\;B,C,D\;
B,C,D进行
模
2
32
加
\;模2^{32}加
模232加,
得到的结果再与数据子分块
x
[
0
]
x_{[0]}
x[0]进行
模
2
32
加
\;模2^{32}加
模232加,
得到的结果再向左移动
3
\;3\;
3位,
将最终得到的结果作为
A
\;A\;
A进行下一次运算。
-
D
=
(
D
+
f
(
A
,
B
,
C
)
+
x
[
1
]
)
<
<
7
D=(D+f(A,B,C)+x_{[1]})<<7
D=(D+f(A,B,C)+x[1])<<7
-
C
=
(
D
+
f
(
D
,
A
,
B
)
+
x
[
2
]
)
<
<
17
C=(D+f(D,A,B)+x_{[2]})<<17
C=(D+f(D,A,B)+x[2])<<17
-
B
=
(
B
+
f
(
C
,
D
,
A
)
+
x
[
3
]
)
<
<
19
B=(B+f(C,D,A)+x_{[3]})<<19\\\;
B=(B+f(C,D,A)+x[3])<<19
-
A
=
(
A
+
f
(
B
,
C
,
D
)
+
x
[
4
]
)
<
<
3
A=(A+f(B,C,D)+x_{[4]})<<3
A=(A+f(B,C,D)+x[4])<<3
-
D
=
(
D
+
f
(
A
,
B
,
C
)
+
x
[
5
]
)
<
<
7
D=(D+f(A,B,C)+x_{[5]})<<7
D=(D+f(A,B,C)+x[5])<<7
-
C
=
(
D
+
f
(
D
,
A
,
B
)
+
x
[
6
]
)
<
<
17
C=(D+f(D,A,B)+x_{[6]})<<17
C=(D+f(D,A,B)+x[6])<<17
-
B
=
(
B
+
f
(
C
,
D
,
A
)
+
x
[
7
]
)
<
<
19
B=(B+f(C,D,A)+x_{[7]})<<19\\\;
B=(B+f(C,D,A)+x[7])<<19
-
A
=
(
A
+
f
(
B
,
C
,
D
)
+
x
[
8
]
)
<
<
3
A=(A+f(B,C,D)+x_{[8]})<<3
A=(A+f(B,C,D)+x[8])<<3
-
D
=
(
D
+
f
(
A
,
B
,
C
)
+
x
[
9
]
)
<
<
7
D=(D+f(A,B,C)+x_{[9]})<<7
D=(D+f(A,B,C)+x[9])<<7
-
C
=
(
D
+
f
(
D
,
A
,
B
)
+
x
[
10
]
)
<
<
17
C=(D+f(D,A,B)+x_{[10]})<<17
C=(D+f(D,A,B)+x[10])<<17
-
B
=
(
B
+
f
(
C
,
D
,
A
)
+
x
[
11
]
)
<
<
19
B=(B+f(C,D,A)+x_{[11]})<<19\\\;
B=(B+f(C,D,A)+x[11])<<19
-
A
=
(
A
+
f
(
B
,
C
,
D
)
+
x
[
12
]
)
<
<
3
A=(A+f(B,C,D)+x_{[12]})<<3
A=(A+f(B,C,D)+x[12])<<3
-
D
=
(
D
+
f
(
A
,
B
,
C
)
+
x
[
13
]
)
<
<
7
D=(D+f(A,B,C)+x_{[13]})<<7
D=(D+f(A,B,C)+x[13])<<7
-
C
=
(
D
+
f
(
D
,
A
,
B
)
+
x
[
14
]
)
<
<
17
C=(D+f(D,A,B)+x_{[14]})<<17
C=(D+f(D,A,B)+x[14])<<17
-
B
=
(
B
+
f
(
C
,
D
,
A
)
+
x
[
15
]
)
<
<
19
B=(B+f(C,D,A)+x_{[15]})<<19\\\;
B=(B+f(C,D,A)+x[15])<<19
第二轮:
-
A
=
(
A
+
g
(
B
,
C
,
D
)
+
x
[
0
]
+
5
A
827999
)
<
<
3
A=(A+g(B,C,D)+x_{[0]}+5A827999)<<3
A=(A+g(B,C,D)+x[0]+5A827999)<<3
-
D
=
(
D
+
g
(
A
,
B
,
C
)
+
x
[
4
]
+
5
A
827999
)
<
<
5
D=(D+g(A,B,C)+x_{[4]}+5A827999)<<5
D=(D+g(A,B,C)+x[4]+5A827999)<<5
-
C
=
(
C
+
g
(
D
,
A
,
B
)
+
x
[
8
]
+
5
A
827999
)
<
<
9
C=(C+g(D,A,B)+x_{[8]}+5A827999)<<9
C=(C+g(D,A,B)+x[8]+5A827999)<<9
-
B
=
(
B
+
g
(
C
,
D
,
A
)
+
x
[
12
]
+
5
A
827999
)
<
<
13
B=(B+g(C,D,A)+x_{[12]}+5A827999)<<13\\\;
B=(B+g(C,D,A)+x[12]+5A827999)<<13
-
A
=
(
A
+
g
(
B
,
C
,
D
)
+
x
[
1
]
+
5
A
827999
)
<
<
3
A=(A+g(B,C,D)+x_{[1]}+5A827999)<<3
A=(A+g(B,C,D)+x[1]+5A827999)<<3
-
D
=
(
D
+
g
(
A
,
B
,
C
)
+
x
[
5
]
+
5
A
827999
)
<
<
5
D=(D+g(A,B,C)+x_{[5]}+5A827999)<<5
D=(D+g(A,B,C)+x[5]+5A827999)<<5
-
C
=
(
C
+
g
(
D
,
A
,
B
)
+
x
[
9
]
+
5
A
827999
)
<
<
9
C=(C+g(D,A,B)+x_{[9]}+5A827999)<<9
C=(C+g(D,A,B)+x[9]+5A827999)<<9
-
B
=
(
B
+
g
(
C
,
D
,
A
)
+
x
[
13
]
+
5
A
827999
)
<
<
13
B=(B+g(C,D,A)+x_{[13]}+5A827999)<<13\\\;
B=(B+g(C,D,A)+x[13]+5A827999)<<13
-
A
=
(
A
+
g
(
B
,
C
,
D
)
+
x
[
2
]
+
5
A
827999
)
<
<
3
A=(A+g(B,C,D)+x_{[2]}+5A827999)<<3
A=(A+g(B,C,D)+x[2]+5A827999)<<3
-
D
=
(
D
+
g
(
A
,
B
,
C
)
+
x
[
6
]
+
5
A
827999
)
<
<
5
D=(D+g(A,B,C)+x_{[6]}+5A827999)<<5
D=(D+g(A,B,C)+x[6]+5A827999)<<5
-
C
=
(
C
+
g
(
D
,
A
,
B
)
+
x
[
10
]
+
5
A
827999
)
<
<
9
C=(C+g(D,A,B)+x_{[10]}+5A827999)<<9
C=(C+g(D,A,B)+x[10]+5A827999)<<9
-
B
=
(
B
+
g
(
C
,
D
,
A
)
+
x
[
14
]
+
5
A
827999
)
<
<
13
B=(B+g(C,D,A)+x_{[14]}+5A827999)<<13\\\;
B=(B+g(C,D,A)+x[14]+5A827999)<<13
-
A
=
(
A
+
g
(
B
,
C
,
D
)
+
x
[
3
]
+
5
A
827999
)
<
<
3
A=(A+g(B,C,D)+x_{[3]}+5A827999)<<3
A=(A+g(B,C,D)+x[3]+5A827999)<<3
-
D
=
(
D
+
g
(
A
,
B
,
C
)
+
x
[
7
]
+
5
A
827999
)
<
<
5
D=(D+g(A,B,C)+x_{[7]}+5A827999)<<5
D=(D+g(A,B,C)+x[7]+5A827999)<<5
-
C
=
(
C
+
g
(
D
,
A
,
B
)
+
x
[
11
]
+
5
A
827999
)
<
<
9
C=(C+g(D,A,B)+x_{[11]}+5A827999)<<9
C=(C+g(D,A,B)+x[11]+5A827999)<<9
-
B
=
(
B
+
g
(
C
,
D
,
A
)
+
x
[
15
]
+
5
A
827999
)
<
<
13
B=(B+g(C,D,A)+x_{[15]}+5A827999)<<13\\\;
B=(B+g(C,D,A)+x[15]+5A827999)<<13
第三轮:
-
A
=
(
A
+
h
(
B
,
C
,
D
)
+
x
[
0
]
+
6
E
D
9
E
D
A
1
)
<
<
3
A=(A+h(B,C,D)+x_{[0]}+6ED9EDA1)<<3
A=(A+h(B,C,D)+x[0]+6ED9EDA1)<<3
-
D
=
(
D
+
h
(
A
,
B
,
C
)
+
x
[
8
]
+
6
E
D
9
E
D
A
1
)
<
<
9
D=(D+h(A,B,C)+x_{[8]}+6ED9EDA1)<<9
D=(D+h(A,B,C)+x[8]+6ED9EDA1)<<9
-
C
=
(
C
+
h
(
D
,
A
,
B
)
+
x
[
4
]
+
6
E
D
9
E
D
A
1
)
<
<
11
C=(C+h(D,A,B)+x_{[4]}+6ED9EDA1)<<11
C=(C+h(D,A,B)+x[4]+6ED9EDA1)<<11
-
B
=
(
B
+
h
(
C
,
D
,
A
)
+
x
[
12
]
+
6
E
D
9
E
D
A
1
)
<
<
15
B=(B+h(C,D,A)+x_{[12]}+6ED9EDA1)<<15\\\;
B=(B+h(C,D,A)+x[12]+6ED9EDA1)<<15
-
A
=
(
A
+
h
(
B
,
C
,
D
)
+
x
[
2
]
+
6
E
D
9
E
D
A
1
)
<
<
3
A=(A+h(B,C,D)+x_{[2]}+6ED9EDA1)<<3
A=(A+h(B,C,D)+x[2]+6ED9EDA1)<<3
-
D
=
(
D
+
h
(
A
,
B
,
C
)
+
x
[
10
]
+
6
E
D
9
E
D
A
1
)
<
<
9
D=(D+h(A,B,C)+x_{[10]}+6ED9EDA1)<<9
D=(D+h(A,B,C)+x[10]+6ED9EDA1)<<9
-
C
=
(
C
+
h
(
D
,
A
,
B
)
+
x
[
6
]
+
6
E
D
9
E
D
A
1
)
<
<
11
C=(C+h(D,A,B)+x_{[6]}+6ED9EDA1)<<11
C=(C+h(D,A,B)+x[6]+6ED9EDA1)<<11
-
B
=
(
B
+
h
(
C
,
D
,
A
)
+
x
[
14
]
+
6
E
D
9
E
D
A
1
)
<
<
15
B=(B+h(C,D,A)+x_{[14]}+6ED9EDA1)<<15\\\;
B=(B+h(C,D,A)+x[14]+6ED9EDA1)<<15
-
A
=
(
A
+
h
(
B
,
C
,
D
)
+
x
[
1
]
+
6
E
D
9
E
D
A
1
)
<
<
3
A=(A+h(B,C,D)+x_{[1]}+6ED9EDA1)<<3
A=(A+h(B,C,D)+x[1]+6ED9EDA1)<<3
-
D
=
(
D
+
h
(
A
,
B
,
C
)
+
x
[
9
]
+
6
E
D
9
E
D
A
1
)
<
<
9
D=(D+h(A,B,C)+x_{[9]}+6ED9EDA1)<<9
D=(D+h(A,B,C)+x[9]+6ED9EDA1)<<9
-
C
=
(
C
+
h
(
D
,
A
,
B
)
+
x
[
5
]
+
6
E
D
9
E
D
A
1
)
<
<
11
C=(C+h(D,A,B)+x_{[5]}+6ED9EDA1)<<11
C=(C+h(D,A,B)+x[5]+6ED9EDA1)<<11
-
B
=
(
B
+
h
(
C
,
D
,
A
)
+
x
[
13
]
+
6
E
D
9
E
D
A
1
)
<
<
15
B=(B+h(C,D,A)+x_{[13]}+6ED9EDA1)<<15\\\;
B=(B+h(C,D,A)+x[13]+6ED9EDA1)<<15
-
A
=
(
A
+
h
(
B
,
C
,
D
)
+
x
[
3
]
+
6
E
D
9
E
D
A
1
)
<
<
3
A=(A+h(B,C,D)+x_{[3]}+6ED9EDA1)<<3
A=(A+h(B,C,D)+x[3]+6ED9EDA1)<<3
-
D
=
(
D
+
h
(
A
,
B
,
C
)
+
x
[
11
]
+
6
E
D
9
E
D
A
1
)
<
<
9
D=(D+h(A,B,C)+x_{[11]}+6ED9EDA1)<<9
D=(D+h(A,B,C)+x[11]+6ED9EDA1)<<9
-
C
=
(
C
+
h
(
D
,
A
,
B
)
+
x
[
7
]
+
6
E
D
9
E
D
A
1
)
<
<
11
C=(C+h(D,A,B)+x_{[7]}+6ED9EDA1)<<11
C=(C+h(D,A,B)+x[7]+6ED9EDA1)<<11
-
B
=
(
B
+
h
(
C
,
D
,
A
)
+
x
[
15
]
+
6
E
D
9
E
D
A
1
)
<
<
15
B=(B+h(C,D,A)+x_{[15]}+6ED9EDA1)<<15\\\;
B=(B+h(C,D,A)+x[15]+6ED9EDA1)<<15