MD5算法原理的说明
鉴于目前网上关于MD5算法原理的说明文章实在太少 有的几篇 也大多晦涩难懂
于是决定写一篇适合初学者看的(一只:老大,你的初学者作何定义 一头:所
谓初学者 就是指那些才刚开始学的人 一只:吐血 !!!!!!!)
1.什么是MD5 :MD5 就是 Message(消息,信息) digest(消化,摘要) algorithm(运算法则) 翻译成普通话就是 信息摘要算法(一只:老大什么叫算法 一头:吐血 !!!!!!!! ) 在90年代初由MIT的计算机科学实验室和RSA Data Security Inc发明,经MD2、MD3和MD4发展而来
2.md5是怎样进行加密的
这个要分步来讲 为了更好的明白 我们来举个例子来讲
如对一个字符串 "string" 进行加密 第一步 我们要把他转换成位 (MD5是对位进行操作) 假如你连什么叫位也不懂 那下面就不用看了 老大 讲是简明易懂 不还是天书嘛
现在ME们假设 string 转换为 位后 是 1010000101110101 当然肯定不是 ME在这里只是把他当作是 因为ME可没功夫再把这个字符串一个个的转成位 。
所以后面你就权当他是 这个字符串 转换 成位的样子就行了
往后呢 就要对这个字节串 (就是前面那个都是1和0的一老串 东西了)进行补位 至于怎么补 很简单只要使你的这个串的长度(有多少个1或者0就是有多长)补成比512的倍数(n倍)位少64位就成 当然这里的位不超过512 只要补到512少64位就成 补的规则嘛 很简单 就是在你的位后先补一个1 其它的补0 就成了 那么补位后 这个串变成 10100000101110101 1(先补的那个1)0000...000
(总共512-64位) (一只:补了这么多 该补完了吧 一头:还差一点 一只:再吐血!!!!!!)这些完成后还要在其后面补上一个64位的数据 当然这个数据也是有规定的(一只:屁话 要不分开来讲干嘛) 这个数据就是原字节串的长度(当然这个长度已被转换成了64位 至此数据补 完 这样大家一看就能明白 其实补完后这串正好是512的倍数 512 * N-64+64
至此前两步 补位和补数据长度完成了
-------------------------------------先终止 实在没时间了---------------
-------------------------------------下面附一篇也不算难懂-------------
在一些初始化处理后,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),<<<s表示循环左移s位,则四种操作为:
FF(a,b,c,d,Mj,s,ti)表示a=b+((a+(F(b,c,d)+Mj+ti)<<<s)
GG(a,b,c,d,Mj,s,ti)表示a=b+((a+(G(b,c,d)+Mj+ti)<<<s)
HH(a,b,c,d,Mj,s,ti)表示a=b+((a+(H(b,c,d)+Mj+ti)<<<s)
II(a,b,c,d,Mj,s,ti)表示a=b+((a+(I(b,c,d)+Mj+ti)<<<s)
这四轮(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.rar (12.2 KB)
- 描述: 测试:
zhong7758521 :
50945d41c5b4f365296a68ea416dc2c7
UJRdQcW082UpamjqQW3Cxw==
- 下载次数: 20
分享到:
相关推荐
1. **MD5算法原理**:MD5算法通过四轮不同的操作(分别是Additive-XOR、Rotational、Additive和Parity)对输入数据进行处理,每轮操作都包含多个步骤,最终得到一个128位的摘要。这个摘要可以视为输入数据的“数字...
"MD5算法说明.doc"可能是对MD5算法的详细解释,包括其工作原理、计算流程和一些示例。而"www.pudn.com.txt"可能是从网站www.pudn.com下载的相关资源,可能包含有关MD5算法的更多资料,如其他实现、应用案例或讨论。 ...
### Verilog MD5算法 #### 一、简介 MD5(Message-Digest Algorithm 5)是一种广泛使用的散列函数,可以将任意长度的数据转换为一个固定长度(通常为128位)的值或者散列码。这种转换是单向的,即只能由消息计算出...
##### 3.2 MD5算法的工作原理 MD5算法通过一系列复杂的数学运算处理输入信息,最终生成一个唯一的哈希值。这一过程具有以下特点: - **不可逆性**:无法从哈希值反推出原始数据。 - **唯一性**:不同数据几乎不...
MD5算法的基本流程包括四个不同的阶段:初始化、数据扩展、迭代计算和结果转换。以下是对这些步骤的详细说明: 1. 初始化:MD5的初始状态由4个32位的寄存器A、B、C和D组成,它们的初始值分别是0x67452301、0xEFCDAB...
例如,当你从互联网上下载一个文件后,可以用MD5校验码来比较本地文件与服务器上文件的MD5值,如果一致,则说明文件完整无误。 MD5的计算过程包括四个主要的步骤:初始化、数据处理、结果扩展和结果组合。这些步骤...
MD5的工作原理是通过一系列的数学运算,如位操作、异或、加法等,将输入的数据分割成固定大小的块,然后经过四个不同的处理阶段:初始化、压缩、扩展和混合,最终生成一个128位的摘要。这个过程确保了即使输入数据有...
`MD5说明.txt`文件可能包含了MD5算法的原理介绍、使用方法,或者在C++实现中的具体细节。MD5算法基于消息块的处理,每个块为64字节。它通过四个不同的阶段——初始化、压缩、扰动和输出——将输入转化为固定长度的...
首先,我们来深入理解MD5的工作原理。MD5算法基于MD4算法进行改进,它包括四个处理阶段:初始化、压缩、填充和输出。在初始化阶段,MD5会用一组特定的常数值填充一个128位的缓冲区。接着,输入的数据被分块处理,每...
1. **MD5的基本原理**:MD5算法通过一系列复杂的数学运算(如位操作、异或、加法等)将输入的数据“消息”转化为128位的固定长度摘要。这个过程是不可逆的,即无法通过摘要恢复原始数据。MD5的目的是确保数据在传输...
如果需要验证数据完整性,可以再次使用相同的方法对数据进行MD5计算,然后与保存的MD5摘要进行比较,如果一致则说明数据未被篡改。 总结,C#中的MD5加密是一个简单的数据处理过程,用于生成数据的数字指纹。虽然MD5...
- `MD5_1.TXT`:可能是MD5算法的另一个版本或相关说明。 通过这些文件,开发者可以深入理解MD5的工作原理,甚至自行为自己的项目实现MD5散列函数。然而,考虑到MD5的安全性问题,现在的开发实践中更多的是使用更...
"MD5算法.txt"很可能包含了MD5算法的详细步骤和原理,可能包括以下几个步骤: 1. 初始填充:将原始消息填充到特定长度,确保其长度模512的余数为448。 2. 添加位长度:在填充后的消息后面添加64位表示原始消息的总...
MD5加密的主要原理是,将输入的数据通过一系列的数学运算,如位移、异或等,最后生成一个128位的二进制数字,通常以32位的十六进制字符串形式表示。由于MD5的特性,相同的输入会产生相同的输出,而不同的输入几乎不...
总的来说,"MD5算法C语言实现"项目提供了一个理解MD5工作原理和C语言编程实践的宝贵资源。通过分析和学习这个实现,开发者可以深入理解哈希函数的内部运作,并将其应用到自己的项目中,例如验证文件的完整性或者构建...
1. **MD5基本原理**:MD5由四个不同的处理函数F、G、H、I以及四个32位的中间变量A、B、C、D组成。通过一系列的位运算(如左移、异或等)和特定的加法运算,对输入数据进行迭代处理,最终得到128位的摘要。 2. **...
在这个情况下,`md5.h`可能会包含MD5函数的声明,比如`MD5Init`、`MD5Update`、`MD5Final`等,这些函数是MD5算法中的关键组成部分,分别用于开始计算、添加数据到哈希过程以及结束并返回最终的MD5摘要。 3. `说明....
4. **DEMO的使用**:`使用说明.txt`应该详细解释了如何运行DEMO,输入数据,查看加密后的MD5值,这对于初学者了解MD5工作原理非常有帮助。 5. **安全注意事项**:尽管MD5曾被视为安全的哈希函数,但由于碰撞攻击的...