群 环 域
群 group
G是一个集合,在此集合上定义代数运算*,若满足下列公理,则称G为群。
1.封闭性
a
∈
G
,
b
∈
G
a\in G,b\in G
a∈G,b∈G=>
a
∗
b
∈
G
a*b\in G
a∗b∈G
2.G中有恒等元素e,使得任何元素与e运算均为元素本身(如:单位矩阵、加法的0,乘法的1)
3.G的每个非0元素都有逆元素,使得元素*逆元素=e(如:加法中的负数,乘法中的倒数)
4.满足结合律
阿贝尔群(可交换群):
1.满足群的四条公理
2.满足交换律(矩阵不满足)
例:(7,3)码在模2加法下构成群,(n,k)码又称群码
0000000 单位元
0011101
0100111
0111010
1001110
1010011
1101001
1110100
封闭性可验证。存在e。每个元素的逆都是他们本身。模2加法相当于异或,满足结合律。故此运算为群。
线性分组编码
环 Ring
R是一个集合,在其上定义两种代数运算+、*,若满足下列公理则称为环
1.+下构成群
2.*下满足封闭性
3. *下满足结合律
4. 分配律成立(包括左分配和右分配)
左分配:a(b+c)=ab+ac
右分配:(b+c)a=ba+ca
如:矩阵的乘对加满足分配律
e.g.
整数集合是环,加法和乘法构成整数环
实系数的多项式环
域 Field
在F集合上定义两种代数运算+和*,若满足下列公理,则F称为域
1.在加法下构成群
2.全体非0元素构成交换乘群(=加法和乘法都成群)
3.对加法和乘法分配律成立
域是有单位元素、非0元素有逆元素的交换环
e,g,以p=3为模的剩余类全体{0,1,2}构成域
有限域:域中元素数目是有限的; 记为: GF(q)q为域的阶,称为q元域;
无限域:域中元素的数目是无限的;
域的阶:域中元素的数目;
GF(2)为二元域,是最小的域
实际应用中,q的量级是
2
1024
2^{1024}
21024,非常巨大
数域包括 复数域、实数域、有理数域
二元域上的多项式
系数取自GF(2),含有一个未定元x的多项式称为GF(2)上的多项式,用f(x)表示。
多项式的加法:同幂次的系数相加
多项式的乘法:正常展开
相加时使用模2加法,即异或,即不进位的加法
x
2
−
x
=
x
2
+
(
1
)
−
1
x
=
x
2
+
x
x^2-x=x^2+(1)^{-1}x=x^2+x
x2−x=x2+(1)−1x=x2+x
二元域上的既约多项式
f(x)是次数>0的多项式,若除了1和多项式本身以外,不能再被GF(2)上的其他多项式除尽,则称为f(x)是二元域上的既约多项式(不可约多项式)。
即,不能分解为两个多项式的乘积
e.g.m=4,f(x)=
x
4
+
x
+
1
x^4+x+1
x4+x+1 等价于五元向量(1,0,0,1,1)
f(x)不能在GF(2)上分解,但可以在更大的范围域内分解
定义:如果有两个域F1,F2,如果
F
1
⊂
F
2
F_1\subset F_2
F1⊂F2,则F2是F1的扩域。
在域F1上的一个不可约多项式,在其扩域F2上可能有根,如果f(x)在F2上有根
α
\alpha
α,则在F2上f(x)有分解因子
(
x
−
α
)
(x-\alpha )
(x−α)
e.g. x 2 + 1 x^2+1 x2+1在R内不可分解,但在复数域上可以分解为(x+i)(x-i)
设P(x)是GF(2)上的m次既约多项式,GF(2)上所有次数小于m的多项式的全体,在模2加法、模P(x)乘法运算下构成一个 2 m 2^m 2m阶的有限域,称为GF( 2 m 2^m 2m),GF(2)是扩域GF( 2 m 2^m 2m)的基域。扩域GF( 2 m 2^m 2m)中有 2 m 2^m 2m个元素,每个元素形如: a m − 1 x m − 1 + a m − 2 x m − 2 + . . . + a 1 x + a 0 a_{m-1}x^{m-1}+a_{m-2}x^{m-2}+...+a_1x+a_0 am−1xm−1+am−2xm−2+...+a1x+a0,可记为m维二元向量的形式( a m − 1 , a m − 2 , . . . , a 1 , a 0 a_{m-1},a_{m-2},...,a_1,a_0 am−1,am−2,...,a1,a0)
设P(x)是GF(2)上的一个m次既约多项式,如果构成的扩域GF(
2
m
2^m
2m)中的全体非0多项式元素对模P(x)乘法构成乘法循环群,即,存在GF(
2
m
2^m
2m)的一个非0元素
α
∈
G
F
(
2
m
)
\alpha \in GF(2^m)
α∈GF(2m),它的各次幂
α
0
,
α
1
,
.
.
.
,
α
2
m
−
2
\alpha ^0,\alpha ^1,...,\alpha ^{2^m-2}
α0,α1,...,α2m−2恰好构成扩域GF(
2
m
2^m
2m)的全部非零元素,则称P(x)是GF(2)上的一个m次本原多项式。有:
1.
α
\alpha
α是GF(2)的一个本原元
2.
α
\alpha
α是GF(2)上的既约多项式P(x)在扩域GF(
2
m
2^m
2m)中的一个根
3.GF(2)上的本原多项式P(x)在扩域GF(
2
m
2^m
2m)中的任何一个根都是本原元
e.g.
(
0
,
1
,
α
,
α
2
,
.
.
.
.
,
α
14
)
(0,1,\alpha,\alpha^2,....,\alpha^{14})
(0,1,α,α2,....,α14)构成域,称为GF(2)的4次扩域。域的阶为16,记为GF(
2
4
2^4
24)。也构成循环群。
求逆:扩展欧几里得算法
对称加密算法 AES
AES(Advanced Encryption Standard) 之 Rijndael算法
迭代分组密码,分组长度为128b,密码长度为128/192/256b,相应的轮数r为10/12/14
讨论密钥长度为128b,分组长度为128b的情况
128b的消息被分为16个字节,每字节8位,记为InputBlock=m0,m1,m2…m15
密钥分组如下:InputKey=k0,k1,k2…k15
内部数据结构表示为一个4x4的矩阵:
I
n
p
u
t
B
l
o
c
k
=
[
m
0
m
4
m
8
m
12
m
1
m
5
m
9
m
13
m
2
m
6
m
10
m
14
m
3
m
7
m
11
m
15
]
InputBlock=\begin{bmatrix} m0& m4& m8& m12\\ m1& m5& m9& m13\\ m2& m6& m10& m14\\ m3& m7& m11& m15 \end{bmatrix}
InputBlock=
m0m1m2m3m4m5m6m7m8m9m10m11m12m13m14m15
I n p u t K e y = [ k 0 k 4 k 8 k 12 k 1 k 5 k 9 k 13 k 2 k 6 k 10 k 14 k 3 k 7 k 11 k 15 ] InputKey=\begin{bmatrix} k0& k4& k8& k12\\ k1& k5& k9& k13\\ k2& k6& k10& k14\\ k3& k7& k11& k15 \end{bmatrix} InputKey= k0k1k2k3k4k5k6k7k8k9k10k11k12k13k14k15
轮变换
Round(State,RoundKey)
State是轮消息矩阵,被看作输入和输出,RoundKey是轮密钥矩阵,由输入密钥通过密钥表导出,一轮的完成将导致State的元素改变状态。
每轮变换由四个不同的变换组成:
SubBytes(State)
模f(x)=
x
8
+
x
4
+
x
3
+
x
+
1
x^8+x^4+x^3+x+1
x8+x4+x3+x+1得到扩域GF(
2
8
2^8
28),有256个元素。
SubBytes函数为State的每个字节(x)提供非线性变换,任一非0的字节x
∈
F
2
8
\in F_{2^8}
∈F28被下面的变换取代:
y
=
A
x
−
1
+
b
y=Ax^{-1}+b
y=Ax−1+b 。求逆体现了变换的非线性,A是可逆的,所以此变换可逆。
e.g.
由于系数是0或1,因此可以将任何这样的多项式表示为比特串
加法是这些位串的XOR
乘法是移位&XOR
通过用不可约多项式的余数重复替换最高幂来实现模约简(也称为移位和XOR)
ShiftRows(State)
每行分别循环左移0,1,2,3位
MixColumns(State)
这个函数对State的每一列作用,迭代四次,下面仅仅描述对一列的作用:
令State的一列为:
[
S
0
S
1
S
2
S
3
]
\begin{bmatrix} S_0\\ S_1\\ S_2\\ S_3 \end{bmatrix}
S0S1S2S3
,把这一列表示为三次多项式:
s
(
x
)
=
s
3
x
3
+
s
2
x
2
+
s
1
x
+
s
0
s(x)=s_3x^3+s_2x^2+s_1x+s_0
s(x)=s3x3+s2x2+s1x+s0,因为s(x)的系数是字节,也就是说是
F
2
8
F_2^8
F28域中的元素,所以这个多项式是
F
2
8
F_2^8
F28上的。
列s(x)上的运算定义为将这个多项式乘以一个固定的3次多项式c(x),然后模x4+1:
d
(
x
)
=
c
(
x
)
×
s
(
x
)
(
m
o
d
x
4
+
1
)
d(x) = c(x) × s(x) (mod \ x^4+1)
d(x)=c(x)×s(x)(mod x4+1)
c
(
x
)
=
c
3
x
3
+
c
2
x
2
+
c
1
x
+
c
0
c(x)=c_3x^3+c_2x^2+c_1x+c_0
c(x)=c3x3+c2x2+c1x+c0
其中,
x
i
(
m
o
d
x
4
+
1
)
=
x
i
m
o
d
4
x^i(mod \ x^4+1)=x^{imod4}
xi(mod x4+1)=ximod4
Rijndeal给出:c3=“03”, c2=“01”, c1=“01”, c0=“02”
在乘积d(x)中,x2的系数是d2=c2s0+c1s1+c0s2+c3s3
上述乘法的系数可以写成以下矩阵乘法:
F
8
F_8
F8上,c(x)与
x
4
+
1
x^4+1
x4+1是互素的,所以在
F
8
(
x
)
F_8(x)
F8(x)中,逆
c
(
x
)
−
1
(
m
o
d
x
4
+
1
)
c(x)^{-1} (modx^4+1)
c(x)−1(modx4+1)是存在的。这等于说,上述矩阵变换是可逆的。
AddRoundKey(State, RoundKey)
这个函数是逐字节、逐比特地将RoundKey中的元素与State中的元素相加。这里的加,是F2中的加,也就是异或运算,是平凡可逆的。
不同轮的密钥比特是不同的。它们使用一个固定的“密钥表”导出密钥,每轮密钥不同,该“密钥表”是非秘密的。具体细节可参阅有关NIST的标准文件。
解密
非对称加密算法 RSA
非对称,指的是加密和解密的密钥不同,又称双钥密码技术、公钥密码技术。
当密钥足够长(现在常用1024bit以上)时,破解极其困难。
特点
公钥可以公布,私钥不可公布。
由私钥可以容易计算出公钥,反之困难。
陷门单向函数
若函数f:A->B可逆(单射+满射),且满足对
x
∈
A
x\in A
x∈A,易于求解f(x),但由f(x)求x极为困难,则称为 单向函数。
陷门单项函数:
f
z
:
A
z
−
>
B
z
,
z
∈
Z
f_z:A_z->B_z,z\in Z
fz:Az−>Bz,z∈Z,Z是陷门信息集合。
1)在给定
z
∈
Z
z\in Z
z∈Z下容易找到一对算法
E
z
E_z
Ez和
D
z
D_z
Dz,使得对所有
x
∈
A
x\in A
x∈A,易于计算
f
z
f_z
fz及其逆,即:
f
z
(
x
)
=
E
z
(
x
)
,
D
z
(
f
z
(
x
)
)
=
x
f_z(x)=E_z(x),D_z(f_z(x))=x
fz(x)=Ez(x),Dz(fz(x))=x。
2)只给定
E
z
E_z
Ez和
D
z
D_z
Dz时,对所有
x
∈
A
x\in A
x∈A都很难从
y
=
f
z
(
x
)
y=f_z(x)
y=fz(x)中计算出x
单向函数是求逆困难的函数,而陷门单项函数是在不知道陷门信息下求逆困难、在知道陷门信息下求逆容易的函数。
用于构造双钥密码的单向函数
-
多项式求根
有限域GF§上的多项式 y = f ( x ) = ( x n + a n − 1 x n − 1 + . . . + a 1 x + a 0 ) m o d p y=f(x)=(x^n+a_{n-1}x^{n-1}+...+a_1x+a_0)mod \ p y=f(x)=(xn+an−1xn−1+...+a1x+a0)mod p,当给定a,x,p后,很容易求出f(x),但已知a,y,p,想求x非常困难,n,p很大时几乎无法求解。 -
离散对数DL
p是大素数,a是{0,1,2…,p-1}中与p互素的数。
已知p,a,x,求f(x)= a x m o d p a^xmod\ p axmod p很容易,但已知p,a,f(x),求x(离散对数)很困难,计算时间是指数级 -
大整数分解FAC
已知大素数p,q,求n=pq只需一次乘法,但已知n求pq非常困难,已知算法有:
试除法、二次筛、数域筛、椭圆曲线。
给定n求pq的问题称为rsa问题。求n=pq分解的问题与以下几个问题等价:
1)给定m,c,n,求d使得 c d = m m o d n c^d=m\ mod\ n cd=m mod n
2)给定k,c,n,求m使得 m k = c m o d n m^k=c \ mod\ n mk=c mod n
3)给定x,m,求是否存在y使得 x = y 2 m o d m x=y^2\ mod\ m x=y2 mod m(二次剩余问题) -
背包问题
-
菲-赫尔曼问题 DHP
给定素数p,可构造一乘群 Z p ∗ = { 1 , 2 , . . . p − 1 } Z^*_p=\{1,2,...p-1\} Zp∗={1,2,...p−1},令a为Z的生成元,若已知 a a , a b a^a,a^b aa,ab,求 a a b a^{ab} aab -
二次剩余问题QR
给定奇合数n和整数a,决定a是否为mod n的平方剩余 -
模n的平方问题 SQROOT
RSA算法
安全性依赖于大整数分解的难度
n
=
p
q
,
φ
(
n
)
=
(
p
−
1
)
(
q
−
1
)
n=pq,\varphi(n)=(p-1)(q-1)
n=pq,φ(n)=(p−1)(q−1)为欧拉函数
公钥为e,满足
(
e
,
φ
(
n
)
)
=
1
(e,\varphi(n))=1
(e,φ(n))=1,私钥为d,
d
=
e
−
1
m
o
d
φ
(
n
)
d=e^{-1}mod\ \varphi(n)
d=e−1mod φ(n)
加密:m->c=
m
e
m
o
d
n
m^emod\ n
memod n
解密:c->m=
c
d
m
o
d
n
c^dmod\ n
cdmod n
也就是找三个大素数p,q,e,求出
d
=
e
−
1
m
o
d
φ
(
n
)
d=e^{-1}mod \varphi(n)
d=e−1modφ(n),求逆的方法是扩展欧几里得算法。
公钥是n,e,密钥是d,公钥可公开,密钥不可公开,
φ
(
n
)
,
p
,
q
\varphi(n),p,q
φ(n),p,q都应该销毁。
用途
加密:A->用B的公钥加密->密文->用B的私钥解密->B,常用于交换对称加密算法的密钥,因为加密解密速度较慢。
数字签名:A->用A的私钥加密->签名->用A的公钥解密->B 得以验证
代码实现思路
建议用python写
大素数生成:随机生成512位二进制数,用Miller-Rabin素性检测,得到三个大素数p,q,e,其中pq用来生成n,e当作公钥。
用扩展欧几里得算法得到e模
ϕ
(
n
)
\phi(n)
ϕ(n)的逆x,这是私钥。
用快速幂算法对明文进行加密,对密文进行解密。其中明文需要分组加密,分组时可以加前导1和0进行填充。
消息认证与杂凑函数
杂凑(哈希)函数
哈希函数可将任意串压缩成固定长度的比特串,哈希函数相关词汇有:hash code, hash result, imprint(短烙印), cryptographic checksum, fingerprint(数字指纹)…
哈希函数:y=H(x)
- x长度任意,y长度固定
- 单向:由x计算y很简单,由y反推x很困难
- 无碰撞:寻找
x
1
!
=
x
2
x_1!=x_2
x1!=x2,使得
H
(
x
1
)
=
H
(
x
2
)
H(x_1)=H(x_2)
H(x1)=H(x2)很困难
(显然哈希函数不是单射函数,但是想碰撞也并不容易) - 雪崩效应:输入的很小变动可以引起输出的较大变动
分类:
- 校验和 cyclic redundancy check (CRC) 循环冗余校验(计网里有相关的题)
- 消息验证码 MAC
- 消息检测码 MDC
- 单向哈希函数 one-way hash function, OWHF
- 抗碰撞hash函数 collision resistant hash function, CRHF(是更好的强单向哈希函数)
- 无碰撞性哈希函数 collision free hash function (存在,但很难找到)
应用:
消息摘要、数字指纹、密文防篡改、作为伪随机函数
常用哈希函数:MD5,SHA
消息认证码(密码校验和)MAC
message authentication code
M
A
C
=
h
(
M
∣
∣
k
)
MAC=h(M||k)
MAC=h(M∣∣k),其中,M是一个变长的消息,K是收发双方共享的密钥,h是哈希函数。
发送者将
(
M
,
h
(
M
∣
∣
k
)
)
(M,h(M||k))
(M,h(M∣∣k))发送,接收者收到消息后,把M加上k哈希,得到MAC’,比较和MAC是否相同,如果相同,则消息未被篡改。
有一些消息是不需要保密,但需要防篡改的,任一拥有密钥的人都可以验证消息的真实性。
消息检测码(篡改验证码) MDC
manipulation detection code
M
D
C
=
h
(
m
)
MDC=h(m)
MDC=h(m),发送者发送MDC,接收者验证h’(m)=?h(m)
迭代哈希函数:
消息X被分为t个分组:
X
1
,
X
2
,
.
.
.
,
X
t
X_1,X_2,...,X_t
X1,X2,...,Xt(需要padding),计算
H
0
=
I
V
,
H
i
=
f
(
X
i
,
H
i
−
1
)
,
.
.
.
,
h
(
X
)
=
g
(
H
t
)
H_0=IV,H_i=f(X_i,H_{i-1}),...,h(X)=g(H_t)
H0=IV,Hi=f(Xi,Hi−1),...,h(X)=g(Ht),其中h是哈希函数,f是轮函数,g是输出变换,IV是一个初始值
提供保密&消息验证的方式:
将M进行哈希,和密钥连接起来,对二者进行对称加密,得到
E
k
(
M
∣
∣
H
(
M
)
)
E_k(M||H(M))
Ek(M∣∣H(M)),其中,
E
k
E_k
Ek是对称加密,k是密钥,M是明文。将这堆东西发送,接收者收到后,先用对称密钥解密,然后计算H‘(M),比较是否相等。
仅提供消息认证:
将H(M)加密,将M明文和加密的H(M)送给接收方,接收方解密后验证。
SHA与MD4和MD5的比较
项目 | MD4 | MD5 | SHA |
---|---|---|---|
Hash值 | 128bit | 128bit | 160bit |
分组长度 | 512bit | 512bit | 512bit |
基本逻辑函数 | 3 | 4 | 3 |
步数 | 3*16=48 | 4*16=64 | 4*20=80 |
速度 | 1 | 1/7 | 3/4 |
MD5
md=mesage digest ,md5现已被攻破 (碰撞性)
- 先对消息进行分组,512bit一组,最后一组需要填充,先填充100……0,使得最后一组的长度正好缺64位才达到512位,剩余的64位,用原消息长度mod
2
64
2^{64}
264填充。
对每个512的分组再次划分,分为16个32位的子分组。 - 初始化MD缓冲区
A: 01 23 45 67(A=67452301)
B: 89 ab cd ef (B=efcdab89)
C: fe dc ba 98(C=98badcfe)
D: 76 54 32 10(D=10325476)
初始化用于计算消息摘要的128位缓冲区。这个缓冲区由四个32位寄存器A、B、C、D表示。寄存器的初始化值为按低位字节在前的顺序存放 - 按512位的分组处理输入消息
这一步为MD5的主循环,包括四轮,如下所示。每个循环都以当前的正在处理的512比特分组Yq和128比特缓冲值ABCD为输入,然后更新缓冲内容。
图中,四轮的操作类似,每一轮进行16次操作。各轮的操作过程如下图所示。
四轮操作的不同之处在于每轮使用的非线性函数不同,在第一轮操作之前,首先把A、B、C、D复制到另外的变量a、b、c、d中。这四个非线性函数分别为(其输入/输出均为32位字)
其中,^表示按位与;v表示按位或;-表示按位反;⊕表示按位异或;+表示模 2 32 2^{32} 232 加;x<<<s表示循环左移s位(0<=s<=31)
这一步中还用到了一个有64个元素的表T[1…64],T[i]是 2 32 ∣ s i n ( i ) ∣ 2^{32}|sin(i)| 232∣sin(i)∣的整数部分 ,i的单位为弧度。
根据以上描述,将这一步骤的处理过程归纳如下:
for i = 0 to N/16−1 do
/* 每次循环处理16个字,即512字节的消息分组*/
/*把第i个字块(512位)分成16个32位子分组拷贝到X中*/
for j = 0 to 15 do
Set X[j] to M[i*16+j]
end /*j 循环*/
/*把A存为AA,B存为BB,C存为CC,D存为DD*/
AA = A
BB = B
CC = C
DD = D
/* 第一轮*/
/* 令[abcd k s i]表示操作
a = b + ((a + F(b,c,d) + X[k] + T[i]) <<< s)
其中,Y<<<s表示Y循环左移s位*/
/* 完成下列16个操作*/
[ABCD 0 7 1 ] [DABC 1 12 2 ] [CDAB 2 17 3 ] [BCDA 3 22 4 ]
[ABCD 4 7 5 ] [DABC 5 12 6 ] [CDAB 6 17 7 ] [BCDA 7 22 8 ]
[ABCD 8 7 9 ] [DABC 9 12 10] [CDAB 10 17 11] [BCDA 11 22 12]
[ABCD 12 7 13] [DABC 13 12 14] [CDAB 14 17 15] [BCDA 15 22 16]
/*令[abcd k s i]表示操作
/* 第二轮*/
a = b + ((a + G(b,c,d) + X[k] + T[i]) <<< s)*/
/*完成下列16个操作*/
[ABCD 1 5 17] [DABC 6 9 18] [CDAB 11 14 19] [BCDA 0 20 20]
[ABCD 5 5 21] [DABC 10 9 22] [CDAB 15 14 23] [BCDA 4 20 24]
[ABCD 9 5 25] [DABC 14 9 26] [CDAB 3 14 27] [BCDA 8 20 28]
[ABCD 13 5 29] [DABC 2 9 30] [CDAB 7 14 31] [BCDA 12 20 32]
/*第三轮*/
/*令[abcd k s t]表示操作
a = b + ((a + H(b,c,d) + X[k] + T[i]) <<< s)*/
/*完成以下16个操作*/
[ABCD 5 4 33] [DABC 8 11 34]
[CDAB 11 16 35] [BCDA 14 23 36]
[ABCD 1 4 37] [DABC 4 11 38]
[CDAB 7 16 39] [BCDA 10 23 40]
[ABCD 13 4 41] [DABC 0 11 42]
[CDAB 3 16 43] [BCDA 6 23 44]
[ABCD 9 4 45] [DABC 12 11 46]
[CDAB 15 16 47] [BCDA 2 23 48]
/*第四轮*/
/*令[abcd k s t]表示操作
a = b + ((a + I(b,c,d) + X[k] + T[i]) <<< s) */
/*完成以下16个操作*/
[ABCD 0 6 49] [DABC 7 10 50]
[CDAB 14 15 51] [BCDA 5 21 52]
[ABCD 12 6 53] [DABC 3 10 54]
[CDAB 10 15 55] [BCDA 1 21 56]
[ABCD 8 6 57] [DABC 15 10 58]
[CDAB 6 15 59] [BCDA 13 21 60]
[ABCD 4 6 61] [DABC 11 10 62]
[CDAB 2 15 63] [BCDA 9 21 64]
A = A + AA
B = B + BB
C = C + CC
D = D + DD
end /*i循环*/
- 输出: 由A、B、C、D四个寄存器的输出按低位字节在前的顺序(即以A的低字节开始、D的高字节结束)得到128位的消息摘要
举例:
以求字符串’‘abc’'的MD5散列值为例来说明上面描述的过程。
'‘abc’'的二进制表示为01100001 01100010 01100011。
(1) 填充消息:消息长l=24,先填充1位1,然后填充423位0,再用消息长24,即0x00000000 00000018填充(十六进制),则:
M[0]=61626380 M[1]=00000000
M[2]=00000000 M[3]=00000000
M[4]=00000000 M[5]=00000000
M[6]=00000000 M[7]=00000000
M[8]=00000000 M[9]=00000000
M[10]=00000000 M[11]=00000000
M[12]=00000000 M[13]=00000000
M[14]=00000000 M[15]=00000018
(2) 初始化:
A: 01 23 45 67
B: 89 ab cd ef
C: fe dc ba 98
D: 76 54 32 10
(3) 主循环:利用前面描述的过程对字块1(本例只有一个字块)进行处理。变量a、b、c、d每一次计算后的中间值可根据参考资料提供的C源代码得到,这里不详细列出。
(4) 输出:
消息摘要=90015098 3cd24fb0 d6963f7d 28e17f72