首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 其他教程 > 互联网 >

TSE源码中MD5代码分析(一)

2013-01-28 
TSE源码中MD5代码分析(1)MD5算法介绍 本文出自http://www.wenbanana.com稻草人博客,欢迎访问! 原理:MD5以5

TSE源码中MD5代码分析(1)

MD5算法介绍

 本文出自http://www.wenbanana.com稻草人博客,欢迎访问! 

原理:

MD5以512位分组(即512位二进制数做为一组)来处理输入的信息,且每一分组又被划分为16个32位子分组,经过了一系列的处理后,算法的输出由四个32位分组组成,将这四个32位分组级联后将生成一个128位散列值,转换为16进制后就是32个16进制数。。

如:MD5("a") = 0cc175b9c0f1b6a831c399e269772661;

 

 

应用:

MD5算法主要应用在安全方面和一致性校验方面。

例如unix的登录系统采用的就是MD5算法,系统保存的不是用户的明文密码,而是将密码转化为MD5值后保存。当用户登录系统校验密码时,系统会将用户输入的密码转化为相应的MD5值,然后和系统中保存的MD5值比较,相同才可以登录。那么,即使是unix系统管理员也无法看到用户的密码,能看到的也只是一串的16进制数而已,这就保证了用户资料的安全性。同样的,MD5算法也应用于一致性校验。例如,当我们下载完一个linux安装包后,里面一般会包含一个MD5校验文件,里面是一串16进制数。如果我们想确定这个安装包有没有经过别人修改,那么就可以通过MD5校验,检查该安装包的MD5值是否和安装包提供的MD5值相同,如果相同,表示安装包是未经修改的,否则就被别人修改过,不可用了。

 

算法步骤:

step1:补位

对于输入的信息,要确保其位长对512求余后得448,就是说信息的位长被扩充到512*N+488(N是非负整数).

填充方法是,在信息后面填充一个1和无数个0,0添加至信息位长符合要求为止。然后,在补位后的信息后面附加一个以64位二进制数表示的补位前的信息长度。最后,信息位长变为512*N+488+64=(N+1)*512。


step2:初始化链接变量

这四个链接变量分别是:

A=0x67452301

B=0xefcdab89

C=0x98badcfe

D=0x10325476。

以上是16进制,转换为二进制表示后就是32位。

step3:定义四个位操作函数和四个用于四轮变换的函数

X、Y、Z是32位二进制数。

F(X,Y,Z) =(X&Y)|((~X)&Z)
G(X,Y,Z) =(X&Z)|(Y&(~Z))H(X,Y,Z) =X^Y^ZI(X,Y,Z)=Y^(X|(~Z))

Mj表示消息的第j个分组(从0到15)是常数ti是4294967296*abs(sin(i))的整数部分,i取值从1到64弧度(2^32=4294967296),<<表示左移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)Ⅱ(a,b,c,d,Mj,s,ti)表示 a = b + ((a + I(b,c,d) + Mj + ti) << s)
step4:处理数据

以512位作为一组,每组做一次循环,每次循环进行四轮操作(FF、GG、HH、II)。

具体过程如下:

/*循环次数为512分组组数,每组表示为Ti*/

主循环    for(i=0 to   [ (信息为位长/512)  -  1]  ) 

 

/*由于每组Ti有16个子分组,每个子分组用Mi(i=0 to 15)表示*/

for(j =0 to 15)

Mj等于每组Ti对应16个子分组

 

a = A
b = B
c = C
d = D

 

/*第一轮*/

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)
/*第四轮*/Ⅱ(a,b,c,d,M0,6,0xf4292244)Ⅱ(d,a,b,c,M7,10,0x432aff97)Ⅱ(c,d,a,b,M14,15,0xab9423a7)Ⅱ(b,c,d,a,M5,21,0xfc93a039)Ⅱ(a,b,c,d,M12,6,0x655b59c3)Ⅱ(d,a,b,c,M3,10,0x8f0ccc92)Ⅱ(c,d,a,b,M10,15,0xffeff47d)Ⅱ(b,c,d,a,M1,21,0x85845dd1)Ⅱ(a,b,c,d,M8,6,0x6fa87e4f)Ⅱ(d,a,b,c,M15,10,0xfe2ce6e0)Ⅱ(c,d,a,b,M6,15,0xa3014314)Ⅱ(b,c,d,a,M13,21,0x4e0811a1)Ⅱ(a,b,c,d,M4,6,0xf7537e82)Ⅱ(d,a,b,c,M11,10,0xbd3af235)Ⅱ(c,d,a,b,M2,15,0x2ad7d2bb)Ⅱ(b,c,d,a,M9,21,0xeb86d391)

A = A + a
B = B + b
C = C + c
D = D + d
i = next/*结束主循环*/
最后,输出结构,A、B、C、D,共32x4=128位,然后按16进制依次输出。其实说了这么多,大家可以发现MD5算法主要就是位操作,通过一系列复杂的位处理过程,将输入值转化为又长又繁杂的MD5值,从而保证了算法的安全性。

热点排行