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)));
作为练习,我正在尝试在 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)));