MD5算法及其性能优化

  • 格式:pdf
  • 大小:214.17 KB
  • 文档页数:3

计算机科学2006V01.33NQ.8(增刊)MD5算法及其性能优化MD5AlgorithmanditsPerformanceOptimization

陆琳琳胡亮(吉林大学软件学院长春130012)

AbstractMD5isatypicalHashencryptiontechniqueanditisquitepopular.Itis

kindofMessage-Digest

algo-

rithrmThispaperisbaseontheresearchofMD5,optimizeprincipleandthebehavioranalysiswiththeMD5,we

gave

theexampleofoptimizingandthemeasureresultofMD5,ontheplatform

ofIntelPentium4CPU/WindowsXP/IE

6.0.Inthispaper,anoticeispresented.Youaresuggestedtoedityourpapersinthisformat.KeywordsMD5algorithm,Performance

optimization

1引言

加密算法的两个重要指标是加密强度和速度。加密强度是算法的基本性质,是算法抵抗各种攻击的能力。在大多数应用中,在保证一定加密强度的前提下,加密/解密的速度是最重要的性质,尤其是对于要求较高速度的应用。加密强度在算法的设计阶段已经确定,算法的不同实现一般不会对加密强度产生影响。而同一加密算法的JJD/解密速度在不同的实现中则可能有很大不同。加密速度在根本上由算法本身的设计决定,但在实现中可以使用各种优化技术最大限度地发挥算法速度的潜力。本文研究在算法确定情况下提高算法速度的实现方法,不涉及新算法设计问题,并给出了对MD5算法的实现进行优化的实例和测量结果。2MD5算法原理MD5算法的全称是Message-Digestalgorithm5(信息一摘要算法),是由MITLaboratoryforCom—puterScience(IT计算机科学实验室)和RSADataSecurityInc(RSA数据安全公司)的RonaldI.Ri—vest开发出来的,经MD2,MD3和MD4发展而来,它的作用是将一个任意长度的“字节串”通过一个不可逆的字符串变换算法变换成一个128bit的大整数,MD5算法共分为五步。2.1添加填充比特任意长度的消息首先需要增加填充位,使其长度恰好为一个比512的倍数小64位的数。添加的方法是:消息后第一个填充位是“1”,其余都是“0”。2.2添加长度值将未添加填充位的消息长度以64位表示(低位字在前),附加到已添加过填充位的消息后面,此时,消息长度恰好是512位的整数倍。2.3初始化加缓存初始化消息摘要缓冲器,四个32位的寄存器变量以十六进制表示,低位字节在前,称之为链接变量。A=Ox01234567B=0x89abcdefC一0xfedcba98D—Ox765432102.4处理512bit报文分组序列这一步为主循环,循环的次数是消息中512位消息分组的数目。首先定义四个非线性函数:如果X,Y和Z的对应位是独立和均匀的,那么结果的每一位也是独立和均匀的。(&是与,I是或,~是非,‘是异或)F(x,Y,z)一(x&y)I((~x)&z)G(x,Y,z)一(x&z)J(y&(~z))H(x,Y,z)一x'yzI(x,Y,z)一y-(xf(~z))

图1MD5主循环将上一步中的四个变量复制到另外的变量中去。主循环有四轮,每轮进行16次操作,每次操作

陆琳琳硕{一研究生.主蛰研究方向为旧络安全。胡亮博_{:,教授,研究方向为分布式系统和嘲络软f1。・172・对a,b,c,d中的其中三个作一次非线性运算,然后将所得结果加上第四个变量,消息的一个子分组(Mi)和一个常数(ti),再将所得结果向左循环一个不定的数,并加上a,b,e,d中之一,最后用该结果取代a,b,c或d中之一,如图1和图2所示。图2MD5的一个执行过程设Mi表示消息的第i个子分组(从0到15)。(((S表示循环左移S位,则四种操作为:FF(a,b,c,d,Mi,s,ti)表示a=b+((a+(F(b,c,d)+Mi+ti)((<s)GG(a,b,C,d,Mi,s,ti)表示a=b+((a+(G(b,e,d)+Mi+ti)(<(s)HH(a,b,C,d,Mi,s,ti)表示a—b+((a+(H(b,e,d)+Mi+ti)((<s)II(a,b,c,d,Mi,s,ti)表示a=b+((a+(I(b,c,d)+Mi+ti)(((s)2.5输出上述四轮操作完成之后,将A,B,C,D分别加上a,b,c,d9输出的128bit消息摘要是A,B,C,D的级联,输出顺序是:从A的低字节开始,直到D的高字节。3MD5算法性能优化结合我们对MD5算法的分析和实验,归纳总结出以下提高算法速度的实现原则,其中测试平台为IntelPentium4CPU/WindowXP/IE6.0。测试数据都是10次测试结果的平均值。3.1展开加密循环和函数加密算法的大部分运行时间是执行加密循环。展开加密循环实际上是将加密循环变为多个循环体中的程序模块,同时将加密循环中调用的函数展开。这样减少了很多条件跳转指令和计算指令,并且将许多变量变为常量,大大提高了速度。表1加密循环和展开加密循环的速度比较加密速度编程方式(千字节/秒)提高(%)加密循环49284.33展开加密循环51845.585.203.2内存拷贝优化在MD5主函数中有一段代码:这段代码对含有填充的数据块进行处理。for(intix—O;ix<buffLen--nlndex;++ix){

*(pAddBuff+ix)=*(buff+nlndex+ix);}

for(intiy=0;iy<nAddBuffSize一8一buffLen+nlndext++

iy){

*(pAddBuff+buffLen--nlndex+iy)=*(ADDBYTE+iy);}

for(intiz=0,iz<8;++iz){

*(pAddBuff+nAddBuffSize--8+iz)一*((unsignedchar*)(1BitLen+iz));)

这处之所以要修改的原因是非常明显的,for循环语句是非常慢的,一般可以把类似的代码段替换成为C语言中的库函数或者操作系统的标准函数。这段C代码可以优化为:memcpy(pAddBuff,buff+nlndex,buffI。en--nlndex);memcpy(pAddBuff+buffLen—nlndex,ADI)BYTE,nAdd-Buffsize一8一buffLen+nlndex);

memcpy(pAddBuff+nAddBuffSize一8,(unsignedchar*)lBitLen。8)l

表2内存拷贝优化前后的速度比较加密速度(千字节/秒)提高(%)优化前49284.33

优化后51174.18

3.83

3.3数组转换函数的优化在MD5算法中有这样一个函数:

。output[_j']=(unsigned)&二oxff);

:帅u。[j+2]娟喊黜摭燃黜殴器鬻勰爻

::毒::吕丰;j三{兰i警篡3:警窨{{;:嚣:[习;;!;;受::嚣;

.显而易见,这个函数的功能只是将一个无符号整形数组转换成为了一个无符号字符形数组。这段代码确实可以优化如下:

表3数组转换函数优化前后的速度比较加密速度(千字节/15")提高(%)

优化前49284.33优化后53318.408.19

这个地方也可叫作算法的优化,不过叫作算法的优化可能有点牵强,但是算法的优化确实是最为重要的,比如说搜索算法,如果选择不当,可能要丧

・173・失很多的效率。3.4不同的操作系统我们把Windows操作系统下的MD5源程序移植到Linux操作系统下,代码是相同的,基本没有变动。通过表4的速度比较,我们可以看出,在Win—dows操作系统下MD5算法对文件处理的速度比Linux下更快。表4不同操作系统的速度比较加密速度提高操作系统(千字节/秒)(%)WindowsXP(IntelPentium4CPO2.79GHz49284.33504MB的内存)LinuxRedHat9.0(1atel1.035Pentium4CPU)49738.07结束语由于MD5算法的复杂性比较大,近几年来MD5算法也已经很完善了,所以对MD5算法的性能改进很困难,尤其在硬件方面。本文基本是在软件方面实现了对MD5算法的性能改进,程序中所使用的代码是在VC++6.0的环境下编写的,但是还有一些方面,如对MD5的安全性能分析等,这些都需要在今后的日子里继续研究和完善。

参考文献1Kahate八CryptographyandNetworkSecurity.邱仲潘,等译.北京:清华大学出版社,2005.110~1212HeahhfieldR,Lawrencekirby,等著.UnleashedC张晓晖,张晓

昕,等译.北京:电子工业出版社,2001.5l~763徐千洋.LinuxC函数库参考手册.北京:中国青年出版社,2002.40~854RonaldLRivest.MD5Message-DigestAlgorithm.http://

Ⅵ1jlmietf.org/rfe/rfel321.txt,1992

(上接第165页)(5)在图像块x“’中嵌入q;位水印信息ma’:从Dq×。中取q。行和n,列组成矩阵D“’;根据湿纸码构造线性方程组H‘1’v=m‘‘’一D‘i’X(”,得出解v;根据v调整X(o,得到含水印图像Y“’。3.2水印的提取算法(1)根据密钥k生成矩阵Da×。。(2)将图像y基于图像内容分块,每块图像为y(.)。(3)从Dq×。中取qi行和n;列组成矩阵D“’。(4)提取水印信息m“’一Do’Yo’。4实验图3为原始图像,其大小为294×378像素。其中有339个像素的可翻转优先级为0.625,有813个像素的可翻转优先级为0.375。选取门限值T为0.375,水印信息为图4所示,其大小为18×64像素。在图3中嵌入了1152位信息得到图5,即含水印图像。可以看出嵌人大量水印信息后的图像与原始图像差别不大,保持了较好的视觉隐蔽性。围3原始一值蹭像圈5岔水印二二值附慷图馋认证图旃认证圈4水印信息图6提取的水印信息局部篡改是二值图像所面临的一个主要恶意攻击,所以脆弱水印算法对局部篡改的抵抗和检测能力,是评价脆弱水印算法有效性的主要依据。依据汉字大小对图像分块,每个图像块大小为19*16。对图5随机选取两处进行修改,如图7所示。图6・174・是从图7提取的水印信息。可以看出提取的水印有明显变化,具有脆弱性。图8为可能被篡改的位置。