随着公众对数字隐私教育的共识,人们对加密算法和网络安全的兴趣越来越大。MD5是一种加密哈希函数算法,它将任意长度的消息作为输入,输出一个长度固定为16字节的结果。在正式介绍MD5之前,我们先来了解一下哈希的概念。
1 哈希
哈希(Hashing)是一种将一般字符串信息转换为复杂数据的过程。它的目的是将数据混淆,使得经过哈希处理后的值与原始值完全不同,从而实现数据的保护和验证。
哈希函数用来将标准数据转换转换为哈希摘要(hash digest)。对于特定的哈希函数(如MD5或SHA1),其摘要大小总是固定的,不受输入大小的影响。
哈希主要用于两个方面:
(1)密码校验:一些网站将用户密码的哈希值保存在服务器中,用户输入的密码经过哈希函数后与保存在服务器中的哈希值进行对比,若匹配则校验成功。
(2)完整性检查:比如上传一个文件到网盘,就可以同时将该文件的哈希值一起保存,这样在文件被下载之后,可以用这个哈希值来判断文件是否损坏。
2 MD5算法
MD5 (Message Digest Method 5
)是一种加密散列算法,它可以将任意长度的字符串转化为一个128位的摘要。基于哈希函数的设计原则,输入字符串的微小变化都会产生一个完全不同的摘要。这是为了尽可能地防止相似的哈希摘要的生成,也称为哈希冲突。
现在来了解一下MD5算法执行的四个步骤:
2.1 添加位
当你要求输入字符串的MD5时,你必须保证给到MD5函数的字符串是512位的倍数,同时还要保留64位(见2.2)。也就是我们需要填充到448位,填充的方法是在输入字符串的末尾添加一个"1",然后再用"0"填充剩余的位数。
比如一个600位的字符串,我们就需要填充到其1024-64=960位,即601位应该为1;602~960位应该为0。
2.2 添加长度
前面说了,还预留了64位,这是用来指示MD5输入字符串的长度的:
最终的字符串一定是512位的倍数。
2.3 MD Buffer
整个字符串被转换成多个块,每个块512位。我们还需要初始化四个不同的缓冲区A、B、C和D。这些缓冲区每个都是32位,它们的值是固定的:
A = 01 23 45 67
B = 89 ab cd ef
C = fe dc ba 98
D = 76 54 32 10
- 1
- 2
- 3
- 4
2.4 计算每个块
每个512位的block被进一步地分为16个32位的子块。MD5算法包含四轮操作,每轮操作都利用所有的子块、MD Buffer以及一个常量数组值。这里将常量数组表示为T[i],i∈[1, 64];将每个子块表示为M[i],i∈[0,15]。下面来看一下计算MD5的整个流程:
上述的非线性过程对于每个子块的每轮计算都是不同的。
- 第一轮:(b&c) | ((~b)&(d))
- 第二轮:(b&d) | (c & (~d))
- 第三轮:b^c^d
- 第四轮:c^(b|(~d))
整个过程是从MD Buffer的A开始计算的,流程如下:
- 将B、C和D传递给一个非线性的计算过程,将得到的结果与A的值相加
- 将子块的值添加到上述结果中
- 添加本次迭代特定的常量值
T[k]
- 对字符串进行循环移位
- 最后,将B的值添加到字符串中,并存储在缓冲区A中
上述步骤会针对每个缓冲区和每个子块进行运算,当最后一个块的最终缓冲区完成后,就得到了MD5。
3 总结
本文大概讲解了MD5的计算过程,理论是挺抽象的,而且理论的目的一定是实践,所以后续我将分析一下MD5的C语言实现代码,看看如何把理论和代码对应上,这样才是真的懂了MD5。
评论记录:
回复评论: