本站首页    管理页面    写新日志    退出


MD5加密技术 
zhu_ruixian 发表于 2006/9/21 16:16:51

前几天,在看OpenVXI3.4的时候,偶然发现了几个奇怪的文件,那就是OpenVXI-3.4\src\cache下面的,base64.c,base64.h,md5.c,md5.h。既然有人把源代码给出来了,不妨花点时间看一下。感觉挺有意思,和大家分享一下。先来看看md5    MD5简介    MD5的全称是Message-Digest Algorithm 5(信息-摘要算法),在90年代初由MIT Laboratory for Computer Science和RSA Data Security Inc的Ronald L. Rivest开发出来,经MD2、MD3和MD4发展而来。它的作用是让大容量信息在用数字签名软件签署私人密匙前被"压缩"成一种保密的格式(就是把一个任意长度的字节串变换成一定长的大整数)。MD5算法的描述和C语言源代码在Internet RFCs 1321中有详细的描述(http://www.ietf.org/rfc/rfc1321.txt),这是一份最权威的文档,由Ronald L. Rivest在1992年8月向IEFT提交。其实\src\cache下面的的源代码,就是从那里面分离出来的。    md5是单向加密的,也就是说加密后产生的字符串不可能,反过来被解密掉。比如你的密码设为:www.xml.org.cn ,md5加密以后就变为了,MD5 ("www.xml.org.cn") = 8133445b961d56d76356d356687394e6,然后把加密后的字符串"8133445b961d56d76356d356687394e6",放到数据库中,下次登录的时候,系统不是解密8133445b961d56d76356d356687394e6,然后与你输入的密码比较,而是把你的密码进行md5加密,然后把加密后的字符串与数据库中的8133445b961d56d76356d356687394e6比较,如果用户把密码丢了,就连系统管理员也不知道你输入的密码是什么。    算法应用  MD5的典型应用是对一段信息(Message)产生信息摘要(Message-Digest),以防止被篡改。比如,有很多软件在下载的时候都有一个文件名相同,文件扩展名为.md5的文件,在这个文件中只有一行文本,这一行文本就是文件的数字签名。MD5将整个文件当作一个大文本信息,通过其不可逆的字符串变换算法,产生了这个唯一的MD5信息摘要。如果在以后传播这个文件的过程中,无论文件的内容发生了任何形式的改变(包括人为修改或者下载过程中线路不稳定引起的传输错误等),只要你对这个文件重新计算MD5时就会发现信息摘要不相同,由此可以确定你得到的只是一个不正确的文件。如果再有一个第三方的认证机构,用MD5还可以防止文件作者的"抵赖",这就是所谓的数字签名应用。    源代码    我们现在看看md5.cpp的源代码。打开以后你会发现里面有8个函数:       void Decode (UINT4 *output,const unsigned char *input,unsigned int len);       void Encode (unsigned char *output,const UINT4 *input,unsigned int len);       void MD5_memcpy (POINTER output,const POINTER input,unsigned int len);       void MD5_memset (POINTER output,int value,unsigned int len);       void MD5Final (unsigned char digest[16],MD5_CTX *context);       void MD5Init (MD5_CTX *context);       void MD5Transform (UINT4 state[4],const unsigned char block[64]);       void MD5Update (MD5_CTX *context,const unsigned char *input,unsigned int inputLen);  其中MD5_memcpy 和MD5_memset和C语言中的memcpy memset一样,只不过它为了提高速度,在内部又实现了一次。可以通过更改宏定义来选择使用系统的memcpy memset,还是用md5中实现的函数。其实Decode  Encode MD5Transform 在外部也用不到。用到的只有MD5Init MD5Update MD5Final 三个函数。比如要加密字符串,下面为实现函数:        void MDString (char* string)        {          MD5_CTX context;          unsigned char digest[16];          unsigned int len = strlen (string);          MD5Init (&context);          MD5Update (&context, (const unsigned char*)string, len);          MD5Final (digest, &context);          printf ("Execute Result: MD%d (\"%s\") = ", MD, string);          MDPrint (digest);          printf ("\n");        }        void MDPrint (unsigned char digest[16])        {          unsigned int i;          for (i = 0; i < 16; i++)          printf ("%02x", digest[i]);        }  加密文件:         void MDFile (char* filename)        {          FILE *file;          MD_CTX context;          int len;          unsigned char buffer[1024], digest[16];          if ((file = fopen (filename, "rb")) == NULL)             printf ("Execute Result: %s can't be opened\n", filename);          else {          MDInit (&context);          while (len = fread (buffer, 1, 1024, file))            MDUpdate (&context, buffer, len);          MD5Final (digest, &context);          fclose (file);          printf ("Execute Result:MD%d (%s) = ", MD, filename);          MDPrint (digest);          printf ("\n");          }       }以上函数都可以在http://www.ietf.org/rfc/rfc1321.txt里面的mddriver.cpp里面找到。修改了一下,就可以生成exe了,可以得到任意字符串和文件的md5加密结果了。

阅读全文(5463) | 回复(3) | 编辑 | 精华

回复:MD5加密技术
zhu_ruixian发表评论于2006/12/20 9:53:52

md5加密结果本来就不是大整数。是一串字符和数字的混合串。

个人主页 | 引用回复 | 主人回复 | 返回 | 编辑 | 删除

回复:MD5加密技术
名ming(游客)发表评论于2006/12/10 13:12:50

md5加密的字符串显示出来的是乱码,而不是大整数,我不明白,能给解释一下吗?谢谢!
个人主页 | 引用回复 | 主人回复 | 返回 | 编辑 | 删除
» 1 »

发表评论:
昵称:
密码:
主页:
标题:
验证码:  (不区分大小写,请仔细填写,输错需重写评论内容!)

 
«November 2025»
1
2345678
9101112131415
16171819202122
23242526272829
30

  公告
欢迎大家留言!既然来了,多少说两句!呵呵!

 


  我的分类(专题)
  最近日志

  最新评论

  留言板

  链接


  Blog信息
blog名称:
日志总数:33
评论数量:61
留言数量:-8
访问次数:238440
建立时间:2006年4月27日



站点首页 | 联系我们 | 博客注册 | 博客登陆

Sponsored By W3CHINA
W3CHINA Blog 0.8 Processed in 0.830 second(s), page refreshed 144794435 times.
《全国人大常委会关于维护互联网安全的决定》  《计算机信息网络国际联网安全保护管理办法》
苏ICP备05006046号