TSE源码中MD5代码分析(1)
本文出自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值相同,如果相同,表示安装包是未经修改的,否则就被别人修改过,不可用了。
对于输入的信息,要确保其位长对512求余后得448,就是说信息的位长被扩充到512*N+488(N是非负整数).
填充方法是,在信息后面填充一个1和无数个0,0添加至信息位长符合要求为止。然后,在补位后的信息后面附加一个以64位二进制数表示的补位前的信息长度。最后,信息位长变为512*N+488+64=(N+1)*512。
这四个链接变量分别是:
A=0x67452301
B=0xefcdab89
C=0x98badcfe
D=0x10325476。
以上是16进制,转换为二进制表示后就是32位。
X、Y、Z是32位二进制数。
F(X,Y,Z) =(X&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)以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)