专注于互联网--专注于架构

最新标签
网站地图
文章索引
Rss订阅

首页 »C 教程 » admin的md5:关于 MD5 的一些知识 »正文

admin的md5:关于 MD5 的一些知识

来源: 发布时间:星期四, 2009年2月12日 浏览:174次 评论:0


md5全称是message-digest algorithm 5在90年代初由mit计算机科学实验室和rsa data security inc发明经md2、md3和md4发展而来

   message-digest泛指字节串(message)hash变换就是把个任意长度字节串变换成定长大整数请注意我使用了“字节串”而不是“串”这个词这种变换只和字节值有关集或编码方式无关

   md5将任意长度“字节串”变换成个128bit大整数并且它是个不可逆串变换算法换句话说就是即使你看到源和算法描述也无法将个md5值变换回原始从数学原理上说原始串有无穷多个这有点象不存在反数学

   md5典型应用是对段message(字节串)产生fingerpr(指纹)以防止被“篡改”举个例子你将段话写在个叫readme.txt文件中并对这个readme.txt产生个md5值并记录在案然后你可以传播这个文件给别人别人如果修改了文件中任何内容你对这个文件重新计算md5时就会发现如果再有个第 3方认证机构用md5还可以防止文件作者“抵赖”这就是所谓数字签名应用

   md5还广泛用于加密和解密技术上在很多操作系统中用户密码是以md5值(或类似其它算法)方式保存 用户login时候系统是把用户输入密码计算成md5值然后再去和系统中保存md5值进行比较而系统并不“知道”用户密码是什么

   些黑客破获这种密码思路方法是种被称为“跑字典”思路方法有两种思路方法得到字典种是日常搜集用做密码串表种是用排列组合思路方法生成先用md5计算出这些字典项md5值然后再用目标md5值在这个字典中检索

   即使假设密码最大长度为8同时密码只能是字母和数字共26+26+10=62个排列组合出字典项数则是p(62,1)+p(62,2)….+p(62,8)那也已经是个很天文数字了存储这个字典就需要tb级磁盘组而且这种思路方法还有个前提就是能获得目标账户密码md5值情况下才可以

   在很多电子商务和社区应用中管理用户account是种最常用基本功能尽管很多application server提供了这些基本组件但很多应用开发者为了管理更大灵活性还是喜欢采用关系数据库来管理用户懒惰做法是用户密码往往使用明文或简单变换后直接保存在数据库中因此这些用户密码对软件Software开发者或系统管理员来说可以说毫无保密可言本文是介绍md5java bean实现同时给出用md5来处理用户account密码例子这种思路方法使得管理员和设计者都无法看到用户密码尽管他们可以化它们但重要点是对于用户密码设置习惯保护

   有兴趣读者可以从这里取得md5也就是rfc 1321文本
http://www.ietf.org/rfc/rfc1321.txt

//------------------------------------------------------------------
md5算法介绍说明

、补位
2、补数据长度
3、化md5参数
4、处理位操作
5、主要变换过程
6、输出结果


补位:
md5算法先对输入数据进行补位使得数据位长度len对512求余结果是448即数据扩展至k*512+448位即k*64+56个字节k为整数
具体补位操作:补个1然后补0至满足上述要求
补数据长度:
个64位数字表示数据原始长度b把b用两个32位数表示这时数据就被填补成长度为512位倍数
化md5参数:
4个32位整数 (a,b,c,d) 用来计算信息摘要化使用是十 6进制表示数字
a=0x01234567
b=0x89abcdef
c=0xfedcba98
d=0x76543210

处理位操作:
xyz为32位整数
f(x,y,z) = x&y|not(x)&z
g(x,y,z) = x&z|y?(z)
h(x,y,z) = x xor y xor z
i(x,y,z) = y xor (x|not(z))

主要变换过程:
使用常t[1 ... 64] t[i]为32位整数用16进制表示数据用16个32位整数m表示
具体过程如下:

/* 处理数据原文 */
for i = 0 to n/16-1 do

/*每把数据原文存放在16个元素x中. */
for j = 0 to 15 do
x[j] to m[i*16+j].
end /结束对j循环

/* save a as aa, b as bb, c as cc, and d as dd.*/
aa = a
bb = b
cc = c
dd = d

/* 第1轮*/
/* 以 [abcd k s i]表示如下操作 a = b + ((a + f(b,c,d) + x[k] + t[i]) <<< s). */

/* do the following 16 operations. */
[abcd 0 7 1] [dabc 1 12 2] [cdab 2 17 3] [bcda 322 4]
[abcd 4 7 5] [dabc 5 12 6] [cdab 6 17 7] [bcda 722 8]
[abcd 8 7 9] [dabc 9 12 10] [cdab 10 17 11] [bcda11 22 12]
[abcd 12 7 13] [dabc 13 12 14] [cdab 14 17 15] [bcda 15 22 16]

/* 第2轮* */
/* 以 [abcd k s i]表示如下操作 a = b + ((a + g(b,c,d) + x[k] + t[i]) <<< s). */
/* do the following 16 operations. */
[abcd 1 5 17] [dabc 6 9 18] [cdab 11 14 19] [bcda0 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] [bcda8 20 28]
[abcd 13 5 29] [dabc 2 9 30] [cdab 7 14 31] [bcda12 20 32]

/* 第3轮*/
/* 以 [abcd k s i]表示如下操作 a = b + ((a + h(b,c,d) + x[k] + t[i]) <<< s). */
/* do the following 16 operations. */
[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] [bcda10 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]

/* 第4轮*/
/* 以 [abcd k s i]表示如下操作 a = b + ((a + i(b,c,d) + x[k] + t[i]) <<< s). */
/* do the following 16 operations. */
[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循环*/

输出结果
0

相关文章

读者评论

发表评论

  • 昵称:
  • 内容: