一、数据摘要算法概述
数据摘要算法是密码学算法中非常重要的一个分支,它通过对所有数据提取指纹信息以实现数据签名、数据完整性校验等功能,由于其不可逆性,有时候会被用做敏感信息的加密。数据摘要算法也被称为哈希(Hash)算法或散列算法。
常用的数据摘要算法主要以下几大类:
1、CRC8、CRC16、CRC32
CRC(Cyclic Redundancy Check,循环冗余校验)算法出现时间较长,应用也十分广泛,尤其是通讯领域,现在应用最多的就是 CRC32 算法,它产生一个4字节(32位)的校验值,一般是以8位十六进制数,如FA 12 CD 45等。CRC算法的优点在于简便、速度快,严格的来说,CRC更应该被称为数据校验算法,但其功能与数据摘要算法类似,因此也作为测试的可选算法。
在 WinRAR、WinZIP 等软件中,也是以 CRC32 作为文件校验算法的。一般常见的简单文件校验(Simple File Verify – SFV)也是以 CRC32算法为基础,它通过生成一个后缀名为 .SFV 的文本文件,这样可以任何时候可以将文件内容 CRC32运算的结果与 .SFV 文件中的值对比来确定此文件的完整性。
与 SFV 相关工具软件有很多,如MagicSFV、MooSFV等。
2、MD2 、MD4、MD5
这是应用非常广泛的一个算法家族,尤其是 MD5(Message-Digest Algorithm 5,消息摘要算法版本5),它由MD2、MD3、MD4发展而来,由Ron Rivest(RSA公司)在1992年提出,目前被广泛应用于数据完整性校验、数据(消息)摘要、数据加密等。MD2、MD4、MD5 都产生16字节(128位)的校验值,一般用32位十六进制数表示。MD2的算法较慢但相对安全,MD4速度很快,但安全性下降,MD5比MD4更安全、速度更快。
目前在互联网上进行大文件传输时,都要得用MD5算法产生一个与文件匹配的、存储MD5值的文本文件(后缀名为 .md5或.md5sum),这样接收者在接收到文件后,就可以利用与 SFV 类似的方法来检查文件完整性,目前绝大多数大型软件公司或开源组织都是以这种方式来校验数据完整性,而且部分操作系统也使用此算法来对用户密码进行加密,另外,它也是目前计算机犯罪中数据取证的最常用算法。
与MD5 相关的工具有很多,如 WinMD5等。
3、SHA1、SHA256、SHA384、SHA512
SHA(Secure Hash Algorithm)是由美国专门制定密码算法的标准机构—— 美国国家标准技术研究院(NIST)制定的,SHA系列算法的摘要长度分别为:SHA为20字节(160位)、SHA256为32字节(256位)、SHA384为48字节(384位)、SHA512为64字节(512位),由于它产生的数据摘要的长度更长,因此更难以发生碰撞,因此也更为安全,它是未来数据摘要算法的发展方向。由于SHA系列算法的数据摘要长度较长,因此其运算速度与MD5相比,也相对较慢。
目前SHA1的应用较为广泛,主要应用于CA和数字证书中,另外在目前互联网中流行的BT软件中,也是使用SHA1来进行文件校验的。
4、RIPEMD、PANAMA、TIGER、ADLER32 等
RIPEMD是Hans Dobbertin等3人在对MD4,MD5缺陷分析基础上,于1996年提出来的,有4个标准128、160、256和320,其对应输出长度分别为16字节、20字节、32字节和40字节。
TIGER由Ross在1995年提出。Tiger号称是最快的Hash算法,专门为64位机器做了优化。
二、常用数据摘要算法的测试
1、测试方法
-
测试范围:常见的数据校验、摘要算法,主要有 CRC32、MD5、SHA1、SHA256、SHA384、SHA512
-
样本数据:2G大小Vmware 虚拟机操作系统的磁盘文件,其中包含其中各种类型的文件,如二进制文件和文本文件等。
-
软件平台:Windows、.NET Framework 2.0
-
硬件平台:
- 机器A(SCSI Disk):软件配置 Windows 2000 + .Net Framework 2.0;硬件配置 CPU:4 (Xeon),2.8G,RAM:2G ,HD:70 GB SCSI
- 机器B(IDE Disk):软件配置 Windows 2003 + .Net Framework 2.0;硬件配置 CPU:1 (P4),2.8G,RAM:1G,HD:40 GB IDE
考虑到整个测试过程只是涉及到文件读取与哈希值的计算,并无过多的与操作系统、软件平台、开发语言相关的操作,因此可以认为上述测试方法的结果具有普遍性,即也适用于其它操作系统平台(如Linux/Unix)或应用语言/平台(C、Java)。
2、测试结果
1)不同配置机器间的对比
在不同机器配置上的平均运算结果如下表所示:
注1:配有SCSI磁盘的机器运行时间反而比 IDE 磁盘时间长,可能是由于前者具有较多的应用负载造成的,如Oracle、WebSphere等,而且其OS为 Windows 2000,在之上运行 .NET 应用程序可能与 Windows 2003 的效率有所差别
注2:上述算法中,只有 CRC32 没有包含在.NET Framework 中,而是使用C#单独实现的,因此可能会对其测试结果带来一些影响。
2)不同算法的CPU占用率比较
在不同的算法运行时,在机器B上监控其对于 CPU 的平均使用时间,结果如下表所示:
三、一些测试结论
- 数据摘要算法的处理是很快的,在一般配置的PC机上使用MD5算法,处理1G的文件数据只需20-30秒(有些专用设备声称达 3GB/秒),不会对应用或机器带来过多负载;
- MD5、SHA1虽然被发现存在缺陷(碰撞),但在近几年内,仍然可以大量使用;
- SHA256/384/512 的速度较慢,可以用于少量数据摘要,目前不适合用于大文件校验;
- ...
注:测试程序相当简单,也写得很烂,有需求者可以在 Comment 中提出。
原文:http://blog.joycode.com/moslem/archive/2006/04/12/74349.joy
分享到:
相关推荐
3. **测试用例**:一组条件或操作的集合,用于验证软件的特定功能是否按预期工作。 4. **粒子群优化算法(PSO)**:一种全局优化算法,通过模拟粒子群体的智能搜索行为,寻找最佳解决方案。 5. **算法改进**:在基本...
3. **测试数据**:在软件测试中,测试数据是指用于验证软件功能或性能的一组输入值,这些输入值应能覆盖尽可能多的执行路径。 4. **惯性权重**:在粒子群优化算法中,惯性权重控制粒子的速度更新,影响算法的探索和...
【摘要】中提到的“基于改进离散粒子群算法的测试优化选择”是一种解决复杂系统测试性设计过程中遇到的组合爆炸问题的智能方法。离散粒子群优化算法(Discrete Particle Swarm Optimization, DPSO)是一种受到自然界...
- **初始化**: 随机生成一组初始测试用例。 - **计算适应度**: 根据上述适应度函数计算每个测试用例的适应度值。 - **更新**: 根据适应度值选择部分测试用例作为下一代的基础,并通过粒子群算法进行更新。 - **终止...
通过向约束网络注入由变异真值表故障模型生成的故障,遗传算法可以搜索出一组能够有效检测电路故障的测试向量,这有助于提高测试效率和测试质量。 4. 测试生成流程: - 构建变异真值表故障模型,考虑各种输入条件...
【摘要】介绍了一种利用粒子群优化算法(PSO)生成瞬态电流测试向量的方法,以提高集成电路故障检测的效率。瞬态电流测试能够检测传统电压和稳态电流测试无法发现的故障,尤其适用于现代高集成度和复杂性的集成电路...
6. **测试效率提升**:优化后的模糊测试算法在单位时间内能检测到更多缺陷,并且能更快地达到较高的代码覆盖率,提高了测试效率。 7. **对比实验**:通过对比实验,优化后的算法在检测含有大量非数值型缺陷的系统时...
基于滑动窗口的动态摘要算法为提高搜索引擎中动态摘要的质量和效率提供了一种新的思路。通过实验证明,该算法不仅能够有效地生成高质量的动态摘要,而且相对于现有的搜索引擎解决方案,具有显著的优势。随着自然语言...
本资源摘要信息是关于嵌入式系统开发人员C语言测试题数据结构与算法的知识点总结。 1. 算法的定义和类型:算法是指解决某个问题的有限步骤,必须由计算机程序实现。算法可以分为不同的类型,如排序算法、搜索算法、...
本文主要探讨了双数组Trie树(Double-Array Trie)算法的一种优化方法,并详细分析了其在实际应用中的表现,特别是在词典管理和自动分词领域。双数组Trie树作为一种高效的字符串搜索算法,在诸多场景下具有重要的应用...
- **对象**:一组无序的名值对。对象开始于{左括号,并在结尾结束于}右括号。每个名值对之间使用,分隔。 - **数组**:值的有序集合。数组开始于[左方括号,并在结尾结束于]右方括号。值之间使用,分隔。 - **值**:...
- **旅行商问题**:这是一个经典的组合优化问题,目标是找到访问一组城市一次并返回起点的最短路径。 #### 方法论 1. **初始化阶段**:使用加权抽样法生成初始最可能域。这种方法考虑了各个城市间的距离,使得初始...
最后,她会进行多组数据的测试,以确保程序的正确性和效率。 总体来说,普里姆算法是一种高效且实用的算法,广泛应用于网络优化问题,如构建最小成本的通信网络。通过这个课程设计,学生不仅能够理解和掌握普里姆...
动态链接库(DLL)是一种共享库,它包含了一组可被多个程序同时调用的函数或资源。在这个压缩包中,DLL文件允许开发者在他们的程序中轻松地集成MD6算法,而无需重新编译MD6的源代码。这提高了代码复用性和效率,同时...