MD5算法简介
MD5(Message Digest Algorithm 5)信息摘要算法的应用广泛,其主要思想是将任意长度的有效数据映射成一个128位(16个字节)的数字指纹,本身是一种单向加密算法。MD5由Ron Rivest于1992年创建,是MD家族的一种。
MD5的基本思路是将原始数据进行哈希处理,即通过一些数学运算将其转换成一段固定长度的数值(16个字节),这段数字就是该数据的摘要或指纹。MD5散列值以十六进制数表示,共32位,可能包含0-9和a-f的数字和字母。MD5摘要值的计算过程非常复杂,涉及到大量的位运算、模算术和条件运算等,其计算过程无法反向推导出原文信息,因此可以起到安全保障作用。
MD5算法实现
实现MD5需要以下步骤: 1.数据填充 MD5算法要求对输入数据(不足512比特)进行预处理,并以512比特分块的形式进行计算。首先,需要将数据填充到长度为N × 512比特的整数倍。填充数据的方法是在数据末尾添加十进制128(二进制表示为10000000),然后通过添加若干个零(二进制表示为00000000)使得填充后的数据长度满足上述要求。如果原始数据长度为L比特,则填充后的数据总长度为(N × 512)比特 = (N × 64)字节;当原始数据的长度mod 512/448不等于0时,填充数为448的数和一些零,所以其填充后的总长度是(N+1)× 512比特。 2.迭代计算 每个512比特(64字节)分组的处理分为四轮,每轮16步。每一步都会改变数据的某些位,因此第一步的输出结果会影响第二步的计算,第二步的结果会影响第三步,以此类推。迭代的结果是摘要由输入数据产生的所有变化,它是一个长达128比特的数值。 3.输出结果 当所有分组被计算完成之后,最终将生成128比特的消息摘要,这可以具有任何形式,如十六进制字符串或二进制字符串等等。MD5摘要的长度始终是32个十六进制数,即16个字节。
MD5即将被SHA-3算法替代,因为由于MD5算法的漏洞被不断的发现和暴露,一些公共机构已经宣布MD5安全性不足,因此不建议使用它进行主要的安全性保护功能。但是,在某些情况下,如在密码重置或临时存储用途上,MD5仍被普遍应用。由于其算法简易、计算过程高效、耗费资源少等特点,还是有一定应用前景的。
C语言实现MD5算法的代码例子中,以下是核心函数proto:
``` void MD5_Transform(uint32_t state[4], const uint8_t[64]) { uint32_t a, b, c, d, m[16]; memcpy((uint8_t*)m, block, 64); a = state[0]; b = state[1]; c = state[2]; d = state[3]; a = FF (a, b, c, d, m[ 0], 7 , 0xd76aa478); d = FF (d, a, b, c, m[ 1], 12, 0xe8c7b756); c = FF (c, d, a, b, m[ 2], 17, 0x242070db); //... /* Round 2 */ a = GG (a, b, c, d, m[ 1], 5 , 0xf61e2562); d = GG (d, a, b, c, m[ 6], 9 , 0xc040b340); c = GG (c, d, a, b, m[11], 14, 0x265e5a51); //... /* Round 3 */ a = HH (a, b, c, d, m[ 5], 4 , 0xf4292244); d = HH (d, a, b, c, m[ 8], 11, 0x432aff97); c = HH (c, d, a, b, m[11], 16, 0xab9423a7); //... /* Round 4 */ a = II (a, b, c, d, m[ 0], 6 , 0x4787c62a); d = II (d, a, b, c, m[ 7], 10, 0xa8304613); c = II (c, d, a, b, m[14], 15, 0xfd469501); //... state[0] += a; state[1] += b; state[2] += c; state[3] += d; } ```以上是md5实现的核心代码,需要注意的是代码中调用的FF、GG、HH、II四个函数,这部分代码比较复杂,主要是用来实现四轮计算。C语言实现MD5算法的过程里,常用的头文件有:stdint.h、string.h、stdlib.h,其中stdint.h用于int32_t,string.h包含字符串处理所需要的函数,stdlib.h包括了动态内存分配和字符串转换(atoi、itoa)等函数。