Flymachine
2021-04-06 11:44:58 +08:00
计算 MD5 时,实际上算的是是“数据+填充字节+数据长度取模”。这样长度的变化必然会导致 MD5 计算结果的变化。至于每一位的变化如何引发 MD5 的变化,你可以理解一下核心的这四个变换函数:
#define F(x,y,z) ((x & y) | (~x & z))
#define G(x,y,z) ((x & z) | (y & ~z))
#define H(x,y,z) (x^y^z)
#define I(x,y,z) (y ^ (x | ~z))
计算 MD5 时会把每一 512 字节的数据会分成 16 个小组,然后去做这 4 个变换运算,结果参与下一个小组运算。
毫无疑问,只要数据中有一位发生了变化,变换函数的结果必然也会发生变化。在之后的运算中差异便会被累积起来,从而使结果出现较大的变化。
我没学过密码学,所以没法说这四个函数是基于怎样的原理设计出来的。只能根据 MD5 的实现代码给你一些参考。