本文详细介绍由汇编内核的MD5算法编写谈代码优化
去年为了破解动网论坛,写了一个用于破解动网论坛的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里面的一段代码:
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=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
作者:crazyd 责编:豆豆技术应用
正在加载评论...
- VC/VC++按钮设计专题
- VC/VC++ 菜单专题
- VC/VC++ 工具条专题
- VC/VC++ 对话框教程
- VC/VC++ 报表教程
- VC/VC++ 控件
- VC/VC++ GDI
- Visual Studio 2008
- VC/VC++ MFC教程
- VC/VC++ QQ
- VC/VC++ Socket编程
- VC/VC++ 钩子编程
- TangramMini组件应用教程
- VC/VC++ 窗体
- VC/VC++ ADO 教程
- Windows CE 教程
- VC/VC++ DLL(动态链接库)编程
- VC/VC++ PDFlib
- VC与MATLAB编程
- VC/VC++ DirectShow 教程
- VC++入门视频教程
- VC/VC++ COM组件设计与应用
- VC/VC++ ATL
- VC/VC++ WTL
- VC/VC++ 定制调试诊断工具和程序
- VC/VC++ 进程
- VC/VC++ Win32
- VC/VC++ WMI
- VC/VC++ 消息
- 更多VC/VC++专题……