什么是 MD5Transform 例程的常量

what is Constants for MD5Transform routine

我正在尝试了解 md5 算法 我在这里找到了用 C++ 编写的代码“http://www.zedwood.com/article/cpp-md5-function” 它在互联网上随处可见 我不明白他们从哪里得到这些 数字以及为什么它们在每个 md5 算法中都是常量 (7,12,17,22,5,....等) 我可以使用不同的数字吗

// Constants for MD5Transform routine.
#define S11 7
#define S12 12
#define S13 17
#define S14 22
#define S21 5
#define S22 9
#define S23 14
#define S24 20
#define S31 4
#define S32 11
#define S33 16
#define S34 23
#define S41 6
#define S42 10
#define S43 15
#define S44 21

并在整个互联网上搜索,但找不到 回答

..请原谅我英文不好

MD5 是在此 official document.

中指定的散列函数

哈希函数由非常熟练的数学家开发,发表在经过很长时间测试的科学论文中,然后才成为工业标准。

这些常量是任意选择的,但必须满足一些复杂的要求,因此哈希函数将适当的熵引入到结果中。 如果您修改它,您很可能会破坏此属性,使散列函数加密变弱,您将无法发现问题。

注意现在的md5被认为是弱的,家用电脑可以在合理的时间内发现碰撞。

基本不用想太多,只用标准解(常量)

维基百科呢? ;)

https://en.wikipedia.org/wiki/MD5

在这里您可以找到这些常量的来源,以及有关算法的更多详细信息。

原因,简而言之,就是MD5算法重复应用了一些二元函数,使用了一些作为算法本身一部分的常量,以及一个非线性函数。由于这是一个散列函数,原始值上的小差异应该会在散列结果中产生大差异(“雪崩效应”)。原始算法(即使不是那么强)尊重这个假设,并且算法本身定义,在散列过程中,散列数的一部分必须以某种(常数)方式左移,以获得非算法的每一“轮”中使用的线性函数 F(以...进一步打乱位)。显然,您可以更改“s”(移位)常量、K(初始化)常量,但在这种情况下,您的算法不是 MD5 算法,即使您尊重关于 F 函数的非线性假设(and/or 你决定使用不同的初始化常量)。

我的意思是,要点是 MD5 散列函数是由一个操作移位数字的程序创建的,使用非线性函数,以及让该程序工作所需的一些初始化值。您可以保留算法本身,或将“和”更改为“不”,或更改用于在每一轮散列输入值的常量值,或更改应用的轮数,使用您自己的 MD5 算法版本不同的...雪崩大小。