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

魅义_郝一伟

魅义_郝一伟

2016-01-29 12:13

由汇编内核的MD5算法编写谈代码优化,由汇编内核的MD5算法编写谈代码优化

由汇编内核的MD5算法编写谈代码优化
       作者:crazyd

下载本文示例工程
       
       去年为了破解动网论坛,写了一个用于破解动网论坛的md5暴力破解程序(http://tongtian.net/pediy/usr/12/12_662.rar),当时为了提高md5算法的运算速度,就将从VCKBASE下载的C代码md5算法改进了一下,结果成效显著。对于代码改写过程中的一些小心得和大家共享,呵呵,高手就不用看了。

开始我们做个实验,先打开两个文档附带的程序,一个工程是MD5C,一个工程是MD5ASM,其中MD5C是从VCKBASE下载的md5算法的标准C语言原代码,MD5ASM是我修改后的md5算法原代码。我给这两个工程的main函数里面都添加了一段回朔代码,用来产生0~99999999的数字,然后用这两个工程里面的可执行文件去对每个数字md5加密。好了,经过一段时间的等待后,就可以看到类似的结果了:
               
       MD5ASM工程在我的机器上的结果是181秒,MD5C在我的机器上产生的结果是999秒,呵呵,数字有点怪,不过我看了表的,差不多是这个时间,巨大的差距是怎样产生的,让我们接下来往下看吧。

在开始正题之前,大家需要清楚一件事,就是MD5C里面的代码虽然效率不高,但绝对是优秀的,因为它主要在演示md5的算法,用的是纯粹的C,没有添加任何平台相干的代码,而我改写的MD5ASM是只能够运行于x86上的windows系统中。所以速度是以兼容性来交换的。
       
        一、算法优化
       
       先观察一下MD5C里面的一段代码:

(本文来源于图老师网站,更多请访问https://m.tulaoshi.com/cyuyanjiaocheng/)
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);}}

这是一段将整数数组转换成为字符数组的代码,我们看看它到底做了些什么。假设主函数输入了一个整数0x30313233,那么这个子函数的调用就可以写成下面的样子:

Encode (output, input, 1)

Input指向一个整数数组,数组的第一个元素是0x30313233,我们接下来看函数转换

i=0,j=0output[0]= (unsigned char)(input[0]& 0xff)=0x33output[1]= (unsigned char)(input[0]& 0xff)=0x32output[2]= (unsigned char)(input[0]& 0xff)=0x31output[3]= (unsigned char)(input[0]& 0xff)=0x30i=0,j=4

     
     跳出循环

     output的内存排列顺序为

     +--+--+--+--+--
     |33|32|31|30|
     +--+--+--+--+--
     ^
     output
     
     现在大家注意了,input的排列顺序是什么?由计算机原理可知道,在计算机内部,数据的存放顺序是“高位对应高位,低位对应低位”,0x30313233中的33因为是个位,是低位,所以对应内存单元的最低位,同理30在内存单元的最高位,由此推出0x30313233在数组中的排列顺序为:

(本文来源于图老师网站,更多请访问https://m.tulaoshi.com/cyuyanjiaocheng/)

+--+--+--+--+--
       |33 32 31 30|
       +--+--+--+--+--
       ^
       input
       
       结果显而易见了,这个函数的功能只是将一个无符号整形数组转换成为了一个无符号字符形数组,作者的目的我虽然不清楚,但是这个地方确实可以优化如下:

output=(unsigned char *)input;

     把这个地方叫作算法的优化可能有点牵强,但是算法的优化确实是最为重要的,比如说搜索算法,如果选择不当,可能要丧失很多的效率。
     
      二、内存拷贝优化
     
     再观察一下MD5C里面的一段代码:

static void MD5_memcpy (unsigned char *output, unsigned int  *input, unsigned int len){  unsigned int i;  for (i = 0; i < len; i++)    output[i] = input[i];}

     这处的为什么要修改是非常明显的,for循环是非常慢的,我们一般可以把类似的代码替换成为C的库函数或者操作系统的标准函数,如:  

CopyMemory ()memcpy()

     这种内存代码你也千万不要尝试自己去实现,那将是一种灾难,在每个操作系统中,内存拷贝可以说是非常频繁的,所以系统的内存拷贝函数基本上都是非常完美的,不信的话你可以自己写一段内存拷贝函数,然后和系统的内

展开更多 50%)
分享

猜你喜欢

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

C语言教程 C语言函数 汇编语言
由汇编内核的MD5算法编写谈代码优化

MD5算法研究(2)

ASP
MD5算法研究(2)

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

MD5算法研究(1)

ASP
MD5算法研究(1)

MD5算法在JS中的实现

电脑网络
MD5算法在JS中的实现

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

java开发之MD5加密算法的实现

编程语言 网络编程
java开发之MD5加密算法的实现

MD5算法的T-SQL实现(FOR SQL2000)(二)

SQLServer
MD5算法的T-SQL实现(FOR SQL2000)(二)

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

《小小大星球》50位不同玩者杯12小时轻松拿法

《小小大星球》50位不同玩者杯12小时轻松拿法

使用Ant和Tomcat创建Web应用

使用Ant和Tomcat创建Web应用
下拉加载更多内容 ↓