由汇编内核MD5算法编写谈代码优化.docxVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
由汇编内核MD5算法编写谈代码优化.docx

由汇编内核的MD5算法编写谈代码优化 作者: HYPERLINK mailto:crazydiamondzgy@ crazyd  HYPERLINK /code/downcode.asp?id=1867 下载本文示例工程 去年为了破解动网论坛,写了一个用于破解动网论坛的md5暴力破解程序( HYPERLINK /pediy/usr/12/12_662.rar /pediy/usr/12/12_662.rar),当时为了提高md5算法的运算速度,就将从 HYPERLINK / \t _blank VCKBASE下载的C代码md5算法改进了一下,结果成效显著。对于代码改写过程中的一些小心得和大家共享,呵呵,高手就不用看了。 开始我们做个实验,先打开两个文档附带的程序,一个工程是MD5C,一个工程是MD5ASM,其中MD5C是从 HYPERLINK / \t _blank VCKBASE下载的md5算法的标准C语言原代码,MD5ASM是我修改后的md5算法原代码。我给这两个工程的main函数里面都添加了一段回朔代码,用来产生0数字,然后用这两个工程里面的可执行文件去对每个数字md5加密。好了,经过一段时间的等待后,就可以看到类似的结果了: ? MD5ASM工程在我的机器上的结果是181秒,MD5C在我的机器上产生的结果是999秒,呵呵,数字有点怪,不过我看了表的,差不多是这个时间,巨大的差距是怎样产生的,让我们接下来往下看吧。 在开始正题之前,大家需要清楚一件事,就是MD5C里面的代码虽然效率不高,但绝对是优秀的,因为它主要在演示md5的算法,用的是纯粹的C,没有添加任何平台相干的代码,而我改写的MD5ASM是只能够运行于x86上的windows系统中。所以速度是以兼容性来交换的。 ?一、算法优化 先观察一下MD5C里面的一段代码: static void Encode (unsigned char *output, unsigned int *input, unsigned int len) { unsigned int i, j; for (i = 0, j = 0; j len; i++, j += 4) { output[j] = (unsigned char)(input[i] 0xff); output[j+1] = (unsigned char)((input[i] 8) 0xff); output[j+2] = (unsigned char)((input[i] 16) 0xff); output[j+3] = (unsigned char)((input[i] 24) 0xff); } } 这是一段将整数数组转换成为字符数组的代码,我们看看它到底做了些什么。假设主函数输入了一个整数0那么这个子函数的调用就可以写成下面的样子: Encode (output, input, 1) Input指向一个整数数组,数组的第一个元素是0我们接下来看函数转换 i=0,j=0 output[0]= (unsigned char)(input[0] 0xff)=0x33 output[1]= (unsigned char)(input[0] 0xff)=0x32 output[2]= (unsigned char)(input[0] 0xff)=0x31 output[3]= (unsigned char)(input[0] 0xff)=0x30 i=0,j=4 跳出循环 output的内存排列顺序为 +--+--+--+--+-- |33|32|31|30| +--+--+--+--+-- ^ output 现在大家注意了,input的排列顺序是什么?由计算机原理可知道,在计算机内部,数据的存放顺序是“高位对应高位,低位对应低位”,0的33因为是个位,是低位,所以对应内存单元的最低位,同理30在内存单元的最高位,由此推出0数组中的排列顺序为: +--+--+--+--+-- |33 32 31 30| +--+--+--+--+-- ^ input 结果显而易见了,这个函数的功能只是将一个无符号整形数组转换成为了一个无符号字符形数组,作者的目的我虽然不清楚,但是这个地方确实可以优化如下: output=(unsigned char *)input; 把这个地方叫作算法的优化可能有点牵强,但是算法的优化确实是最为重要的,比如说搜索算法,如果选择不当,可能要丧失很多的效率。? ?二、内存拷贝优化 再观察一下MD5C里面的一段代码: stat

文档评论(0)

dmz158 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档