在一些初始化处理后,MD5以512位分组来处理输入文本,每一分组又划分为16个32位子分组。算法的输出由四个32位分组组成,将它们级联形成一个128位散列值。
首先填充消息使其长度恰好为一个比512位的倍数仅小64位的数。填充方法是附一个1在消息后面,后接所要求的多个0,然后在其后附上64位的消息长度(填充前)。这两步的作用是使消息长度恰好是512位的整数倍(算法的其余部分要求如此),同时确保不同的消息在填充后不相同。
四个32位变量初始化为:
A=0x01234567
B=0x89abcdef
C=0xfedcba98
D=0x76543210
它们称为链接变量(chaining variable)
接着进行算法的主循环,循环的次数是消息中512位消息分组的数目。
将上面四个变量复制到别外的变量中:A到a,B到b,C到c,D到d。
主循环有四轮(MD4只有三轮),每轮很相拟。第一轮进行16次操作。每次操作对a,b,c和d中的其中三个作一次非线性函数运算,然后将所得结果加上第四个变量,文本的一个子分组和一个常数。再将所得结果向右环移一个不定的数,并加上a,b,c或d中之一。最后用该结果取代a,b,c或d中之一。
以一下是每次操作中用到的四个非线性函数(每轮一个)。
F(X,Y,Z)=(X&Y)|((~X)&Z)
G(X,Y,Z)=(X&Z)|(Y&(~Z))
H(X,Y,Z)=X^Y^Z
I(X,Y,Z)=Y^(X|(~Z))
(&是与,|是或,~是非,^是异或)
这些函数是这样设计的:如果X、Y和Z的对应位是独立和均匀的,那么结果的每一位也应是独立和均匀的。
函数F是按逐位方式操作:如果X,那么Y,否则Z。函数H是逐位奇偶操作符。
设Mj表示消息的第j个子分组(从0到15),<<FF(a,b,c,d,Mj,s,ti)表示a=b+((a+(F(b,c,d)+Mj+ti)<<GG(a,b,c,d,Mj,s,ti)表示a=b+((a+(G(b,c,d)+Mj+ti)<<HH(a,b,c,d,Mj,s,ti)表示a=b+((a+(H(b,c,d)+Mj+ti)<<II(a,b,c,d,Mj,s,ti)表示a=b+((a+(I(b,c,d)+Mj+ti)<<这四轮(64步)是:
第一轮
FF(a,b,c,d,M0,7,0xd76aa478)
FF(d,a,b,c,M1,12,0xe8c7b756)
FF(c,d,a,b,M2,17,0x242070db)
FF(b,c,d,a,M3,22,0xc1bdceee)
FF(a,b,c,d,M4,7,0xf57c0faf)
FF(d,a,b,c,M5,12,0x4787c62a)
FF(c,d,a,b,M6,17,0xa8304613)
FF(b,c,d,a,M7,22,0xfd469501)
FF(a,b,c,d,M8,7,0x698098d8)
FF(d,a,b,c,M9,12,0x8b44f7af)
FF(c,d,a,b,M10,17,0xffff5bb1)
FF(b,c,d,a,M11,22,0x895cd7be)
FF(a,b,c,d,M12,7,0x6b901122)
FF(d,a,b,c,M13,12,0xfd987193)
FF(c,d,a,b,M14,17,0xa679438e)
FF(b,c,d,a,M15,22,0x49b40821)
第二轮
GG(a,b,c,d,M1,5,0xf61e2562)
GG(d,a,b,c,M6,9,0xc040b340)
GG(c,d,a,b,M11,14,0x265e5a51)
GG(b,c,d,a,M0,20,0xe9b6c7aa)
GG(a,b,c,d,M5,5,0xd62f105d)
GG(d,a,b,c,M10,9,0x02441453)
GG(c,d,a,b,M15,14,0xd8a1e681)
GG(b,c,d,a,M4,20,0xe7d3fbc8)
GG(a,b,c,d,M9,5,0x21e1cde6)
GG(d,a,b,c,M14,9,0xc33707d6)
GG(c,d,a,b,M3,14,0xf4d50d87)
GG(b,c,d,a,M8,20,0x455a14ed)
GG(a,b,c,d,M13,5,0xa9e3e905)
GG(d,a,b,c,M2,9,0xfcefa3f8)
GG(c,d,a,b,M7,14,0x676f02d9)
GG(b,c,d,a,M12,20,0x8d2a4c8a)
第三轮
HH(a,b,c,d,M5,4,0xfffa3942)
HH(d,a,b,c,M8,11,0x8771f681)
HH(c,d,a,b,M11,16,0x6d9d6122)
HH(b,c,d,a,M14,23,0xfde5380c)
HH(a,b,c,d,M1,4,0xa4beea44)
HH(d,a,b,c,M4,11,0x4bdecfa9)
HH(c,d,a,b,M7,16,0xf6bb4b60)
HH(b,c,d,a,M10,23,0xbebfbc70)
HH(a,b,c,d,M13,4,0x289b7ec6)
HH(d,a,b,c,M0,11,0xeaa127fa)
HH(c,d,a,b,M3,16,0xd4ef3085)
HH(b,c,d,a,M6,23,0x04881d05)
HH(a,b,c,d,M9,4,0xd9d4d039)
HH(d,a,b,c,M12,11,0xe6db99e5)
HH(c,d,a,b,M15,16,0x1fa27cf8)
HH(b,c,d,a,M2,23,0xc4ac5665)
第四轮
II(a,b,c,d,M0,6,0xf4292244)
II(d,a,b,c,M7,10,0x432aff97)
II(c,d,a,b,M14,15,0xab9423a7)
II(b,c,d,a,M5,21,0xfc93a039)
II(a,b,c,d,M12,6,0x655b59c3)
II(d,a,b,c,M3,10,0x8f0ccc92)
II(c,d,a,b,M10,15,0xffeff47d)
II(b,c,d,a,M1,21,0x85845dd1)
II(a,b,c,d,M8,6,0x6fa87e4f)
II(d,a,b,c,M15,10,0xfe2ce6e0)
II(c,d,a,b,M6,15,0xa3014314)
II(b,c,d,a,M13,21,0x4e0811a1)
II(a,b,c,d,M4,6,0xf7537e82)
II(d,a,b,c,M11,10,0xbd3af235)
II(c,d,a,b,M2,15,0x2ad7d2bb)
II(b,c,d,a,M9,21,0xeb86d391)
常数ti可以如下选择:
在第i步中,ti是4294967296*abs(sin(i))的整数部分,i的单位是弧度。
(2的32次方)
所有这些完成之后,将A,B,C,D分别加上a,b,c,d。然后用下一分组数据继续运行算法,最后的输出是A,B,C和D的级联。
MD5的安全性
MD5相对MD4所作的改进:
1.增加了第四轮.
2.每一步均有唯一的加法常数.
3.为减弱第二轮中函数G的对称性从(X&Y)|(X&Z)|(Y&Z)变为(X&Z)|(Y&(~Z))
4.第一步加上了上一步的结果,这将引起更快的雪崩效应.
5.改变了第二轮和第三轮中访问消息子分组的次序,使其更不相似.
6.近似优化了每一轮中的循环左移位移量以实现更快的雪崩效应.各轮的位移量互不相同.
分享到:
相关推荐
### MD5算法原理及其碰撞攻击 #### 一、MD5消息摘要算法概述 MD5(Message-Digest Algorithm 5)是一种被广泛应用于数据完整性和消息认证领域的哈希函数。它能够将任意长度的输入(通常称为消息或数据)转换成一个...
测试: zhong7758521 : 50945d41c5b4f365296a68ea416dc2c7 UJRdQcW082UpamjqQW3Cxw== 博文链接:https://graduate.iteye.com/blog/239817
MD5算法是一种广泛使用的 Hash 算法,常用于确保信息传输的完整性与一致性。对于输入的任一不定长度信息, MD5算法在对最后一块进行填充后用512个比特对其进行分组,使用压缩函数将其生成4个32比特的数据,合并为128...
1. **MD5算法原理**:MD5算法通过四轮不同的操作(分别是Additive-XOR、Rotational、Additive和Parity)对输入数据进行处理,每轮操作都包含多个步骤,最终得到一个128位的摘要。这个摘要可以视为输入数据的“数字...
#### 二、MD5算法原理 1. **输入与输出**:MD5算法可以接收任意长度的信息作为输入,并产生一个固定长度(128位)的消息摘要。 2. **不可逆性**:即使知道消息摘要的内容,也无法反推出原始数据。 3. **唯一性**:...
#### 二、MD5算法原理 MD5算法主要分为以下几个步骤: 1. **初始化**:定义四个变量`A`、`B`、`C`、`D`,它们分别代表了散列过程中的四个32位寄存器的初始值。 2. **填充消息**:如果原始消息的长度不足,则会在其...
### MD5算法原理 MD5算法的核心是将输入数据转换成一系列的16字节块,并通过四轮复杂的运算得到最终的摘要。每一轮运算中包含了不同的函数,如`ff`、`gg`、`hh`、`ii`,这些函数负责数据的混淆和扩散,以确保即使是...
在MATLAB中实现MD5,理解这些函数的工作原理和交互方式至关重要。通过阅读代码中的注释,可以深入理解MD5算法的内部工作机制。需要注意的是,为了提高效率,MATLAB中的MD5实现可能会使用向量化操作,以减少循环次数...
MD5算法,全称为Message-Digest Algorithm 5,是一种广泛使用的加密散列函数,设计初衷是为了产生一个固定长度的128位(16字节)摘要,用于确保数据的完整性和安全性。该算法结合了压缩、加密和哈希算法的特性,将...
MD5算法的工作原理可以分为四个步骤:初始化、分块、处理和结果输出。首先,MD5会用一组初始值初始化四个32位的变量A、B、C和D。接着,输入的数据被分成512位的块,每个块进行一系列的位操作,包括左旋转、异或、...
通过学习和理解这些代码,可以加深对MD5算法原理的理解,以及如何在实际项目中应用和实现哈希函数。对于开发人员来说,掌握哈希函数的原理和实现是至关重要的,因为它们在数据安全和验证中扮演着关键角色。
1. **MD5算法原理**:MD5基于消息块处理,通过一系列的数学运算(如位移、异或、加法等)和特定的初始化向量,将输入的数据分块并逐步转化为最终的128位哈希值。这个过程分为四个阶段:初始化、压缩函数、填充和结果...
本文通过对MD5算法原理的深入分析以及与其他加密算法的结合应用,提出了一种基于MD5摘要算法的一次一密方法,有效地提升了身份认证的安全性。这种方案不仅适用于高校的艺术类远程招生与考试管理系统,对于其他需要...
#### 二、MD5算法原理简述 MD5算法的主要过程包括填充消息使其长度满足特定条件、添加长度信息以及进行一系列复杂的变换等步骤。具体而言: - **填充消息**:通过在消息末尾添加特定的比特序列来确保消息长度模512的...
### MD5算法C语言实现详解...同时,对于想要深入了解MD5算法原理及其实际应用的人来说,这份代码也是一个很好的起点。 以上就是MD5算法C语言实现的基本介绍及分析,希望能帮助读者更好地理解和掌握MD5算法的工作机制。
#### MD5算法原理 MD5算法的核心在于将任意长度的数据转换为固定长度的128位消息摘要。其具体步骤如下: 1. **预处理**:将原始信息进行补位处理,确保其字节长度满足特定条件(模512等于448),并在末尾追加一个...
#### 二、MD5算法原理 ##### 2.1 MD5算法简介 MD5(Message-Digest Algorithm 5)是一种广泛使用的哈希加密技术,由MIT实验室和RSA数据安全公司的Ronald L. Rivest开发。它的发展经历了MD2、MD3和MD4等版本,最终...
3. MD5算法原理:理解MD5如何通过输入数据生成固定长度的摘要。 4. 第三方库或自定义函数:学习如何引入或编写计算MD5的函数。 通过阅读和分析这两个文件,你可以深入理解MD5算法及其在ASP环境下的应用,这对于进行...