关于MD5算法的分析及其性能优化
字符串长度计算工具本文主要介绍了MD5算法的实现原理和对源数据信息的加密流程,然后从算法实现的角度,依据当前CPU计算机制,对MD5算法的计算时间的消耗进行分析,并提出了相应的性能优化建议,从而提升MD5算法的计算速度。
标签:MD5;优化;性能优化
1 概述
随着科学技术的发展以及互联网络的不断应用,信息安全的重要性已经成为继大数据、云计算之后的IT行业热门发展方向。在信息安全体系中,信息加密是其中非常重要的部分,也是应对各种网络攻击或者暴力破解工具很好的应对手段。MD5算法是目前应用较为广泛的一种算法,它允许应用系统将不同数据信息加密成固定128位的加密字符串,从而有效地保证了数据信息的保密性、完整性和可用性。然而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到10次的循环次数,通过多个循环程序块来完成整个MD5算法。同时,为了减少内存寻址的时间浪费,能够采用常量的变量,尽量在预定义时采用常量的形式定义。
3.2 避免指令跳转
在当前CPU的计算机制中,执行固定内存块的指令速度是最块的,如果发生程序地址指针改变,则CPU将会浪费一部分时间去内存寻址或从虚拟交换空间或磁盘中读取数据,而这将会浪费大量的计算时间。对于常见的编程语言,if…else或者for、while循环,甚至是goto语句,都是常见的指令跳转语句,在实现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].哈尔滨师范大学自然科学学报,2011(05).
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论