PHP 中的 MD5 脚本

MD5 script in PHP

作为练习,我正在尝试在 PHP 中实现 MD5。我知道 PHP 有一个内置函数,但我想阅读 运行 并研究一个工作源。我发现 this script 在取消注释适当的部分(以启用消息填充)并且相应地格式化数组(为了与我的 PHP 版本兼容)时效果很好。但是生成的散列 - 尽管长度正确- 不是 MD5。例如,零长度字符串的 MD5 散列应为:

d41d8cd98f00b204e9800998ecf8427e

但脚本返回的哈希值是:

85bd946a585af9fd3fb9eda68707c1d8

我试过其他字符串,但没有相关性。我一直在研究 MD5,所以对它的工作原理有一定的了解。我一直在审问剧本,但它似乎是合法的。我想我是在向另一个人大喊大叫,以迎接发现为什么这个脚本不返回 MD5 的挑战。

此脚本未返回真正的 MD5 哈希值,因为旋转函数存在问题。

PHP 当前不提供本机按位旋转函数。然而,可以通过组合左移结果和右移结果来实现按位旋转。但是,在负符号整数的右移过程中,符号位被移入以保留操作数的符号;这会产生不良后果,可以使用位掩码来克服。

其中 $x 是输入值,$c 是要移位的位数。所有值均为 32 位。

原码:

`return ($x << $c) | ($x >> (32 - $c));`

新代码:

if($x < 0){
    return ($x << $c) | abs( ((pow(2, $c)) * -1) - ($x >> (32 - $c)));
} else { 
    return ($x << $c) |                            ($x >> (32 - $c)) ;
}

我特意在第 4 行留下多个空格以与第 2 行形成对比,以显示公式相似性和位掩码的存在(或不存在)。

三进制格式:

 return ($x < 0) ? (($x << $c) | abs( ((pow(2, $c)) * -1) - 
        ($x >> (32 - $c)))) : (($x << $c) | ($x >> (32 - $c)));