理 研究 柬工案捷术 224 关于MD5算法的分析及其性能优化 崔永辉’,徐鹏 ,阳征鹏 (1.国防信息学院,武汉43001O;2.中国人民解放军66267部队,石家庄050081) 摘要:本文主要介绍了MD5算法的实现原理和对源数据信息的加密流程,然后从算法实现的角度,依据当前CPU计算机制,对MD5算法的计 算时间的消耗进行分析,并提出了相应的性能优化建议,从而提升Mo5算法的计算速度。 关键词:MD5;优化;性能优化 DOI:10.16640/j.cnki.37—1222/t.2015.21.200 1概述 随着科学技术的发展以及互联网络的不断应用,信息安全的重要 性已经成为继大数据、云计算之后的IT行业热门发展方向。在信息 安全体系中,信息加密是其中非常重要的部分,也是应对各种网络攻 击或者暴力破解工具很好的应对手段。MD5算法是目前应用较为广泛 的一种算法,它允许应用系统将不同数据信息加密成固定t28位的加 密字符串,从而有效地保证了数据信息的保密性、完整性和可用性。 然而MD5算法过程繁琐、算法复杂,在具体实现时必须考虑其计算 性能,如果加密时间过长,将会为实际应用带来非常差的用户体验。 所以对于MD5算法的研究以及对其计算性能的优化分析,对于MD5 算法实现来说,具有非常大的现实意义。 2 MD5算法 MD5是Riverst在之前MD2,MD3,MD4的基础上,经过升级 优化开发而来。采用MD5算法,可以让任意长度的数据信息,变成 一个128位固定长度的大整数的加密形式,从而实现了数据信息的加 密,而MD5算法的加密过程是一个不可逆的过程,在一定程度上保 证了数据信息的安全性,对于一些暴力破解、密码嗅探的工具来说, 对MD5算法加密的数据解密将是一个工作量非常大的过程。 MD5算法的处理过程需要经过以下几个阶段:字符填充,长度加 长,块分解,变量初始化,块处理。 其中,MD5算法的字符填充,因为MD5算法最终是对512位的 数据块进行处理,所以对于整体数据源长度不是512倍数的,需要将 其字符填充,是最终的长度为512位长度的倍数减去64位。然后信 息源长度加长,即用64位长度表示字符填充之前原信息源长度,填 充到最后64位,最终使得到的字符串长度为512位的倍数。第三步, 块分解,将最终得到的字符串以512位长度为单位,对其进行划分, 形成最终的数据块,第四步,生成变量,即生成四个32位长的十六 进制变量。得到这四个初始化变量之后,就可以对生成的数据块进行 MD5算法处理。 块处理的过程,是使用MD5算法的过程,假如有四个变量A,B, C,D,其值与上述四个初始化值一一对应,然后将ABCD组合成一 个128为长度的数值放到一个寄存器中。将第一个512位长度的数据 块,以32位长度为单位,平均分成16个小块,从而得到了从0到15 的字块。假如存在一个常量数组,其元素个数为64,每个元素为32 位长度的常量数值。 首先使用第一个非线性函数对变量B,C,D进行计算,将结果 到存储128位数据的寄存器中,然后将A加入到该寄存器,将第0个 消息加入到128位寄存器中,将常量数组的第0个常量元素加入到寄 存器中,然后将寄存器左移某个值(该值是不断变化的)位,然后将 变量B加入到128位寄存器中。然后从头开始,循环16次,将512 位长度的16个子块都进行相同处理。 然后依次使用第二个、第三个、第四个非线性函数开始,按照上 面的方法,对该数据块进行处理,最终将得到128位寄存器的值。最 后,将A,B,C,D变量的值分别自加,按照上述算法,依次对一下 组512位的数据进行相同的算法处理,最终得到的128位寄存器的值 即为源信息数据的MD5算法加密的最终结果。 3 MD5算法的性能优化 3.1 展开MD5算法的循环过程 由于MD5算法需要很多循环,而且很多时候采用多层循环嵌套 来实现。对于计算机体系来说,多次的循环与多层次的循环嵌套,加 上变量的地址寻址,自身在CPU执行时,会浪费大量的时间,加上 多次循环和多层循环嵌套,与变量地址寻址使得CPU指令流水线的 预取与阻断的机制失效,从而增加了大量的计算时间。对于大数量级 和多层循环嵌套的MD5算法来说,可以通过展开循环过程来提升其 计算时间。所以在编程实现MD5算法时,尽量将每个循环体采用5 到1o次的循环次数,通过多个循环程序块来完成整个MD5算法。同时, 为了减少内存寻址的时间浪费,能够采用常量的变量,尽量在预定义 时采用常量的形式定义。 3.2避免指令跳转 在当前CPU的计算机制中,执行固定内存块的指令速度是最块的, 如果发生程序地址指针改变,则CPU将会浪费一部分时间去内存寻 址或从虚拟交换空间或磁盘中读取数据,而这将会浪费大量的计算时 间。对于常见的编程语言,if…else或者for、while循环,甚至是gom 语句,都是常见的指令跳转语句,在实现MD5算法时,尽量避免使 用产生指令跳转的语句,从而减少CPU执行代码时的寻址时间。 3.3变量长度CPU寄存器匹配 不同计算机的CPU寄存器大小是不一样的。对于长度大于CPU 寄存器长度的变量,CPU将会分多次进行计算,最后将结果进行整合 来完成计算。如果变量长度小于CPU寄存器长度,那么CPU将会在 寄存器后附加其他的数据或者执行来完成计算。对于一个32位寄存 器的CPU来说,对一个32位变量的计算时间将比对一个16位变量的 计算时间块近一倍,所以在复杂繁琐的MD5算法实现过程中,定义 变量或常量时,尽量与当前执行算法的CPU寄存器长度一致,从而 增加整个代码中数值的计算速度。 3.4减少变量个数 由于操作系统对于变量的存放机制,使得CPU在对某个变量进 行计算时,需要按照变量指针从内存中寻址读取,存放到寄存器中进 行计算。整个计算机框架CPU从内存读取和写入的时间对于CPU计 算来说慢很多,所以在MD5算法实现时,尽量减少变量的个数。此外, 常量与变量的存放机制也有所不同,所以对于固定不变的数据尽量使 用常量类型代替。 4总结 MD5算法是对按照固定的循环和计算对源数据信息进行加密,最 终生成128位的加密数据。由于整个过程计算量非常大,而且过程非 常繁琐,所以在算法实现时,会耗费大量的时间。对于MD5算法实 现的性能优化的机制非常多,主要是考虑当前系统的CPU计算机制, 采用最匹配的方式,最终减少加密运算的时间,更块地得到128位加 密数据。 参考文献: [1】毛熠,陈娜.MD5算法的研究与改进【D】.计算机工程,2012(24). [2】么丽颖.MD5算法的分析和改进[J].哈尔滨师范大学自然科学学 报,2 011(05).