【问题标题】:MD5 script in PHPPHP 中的 MD5 脚本
【发布时间】:2017-02-28 06:27:20
【问题描述】:

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

d41d8cd98f00b204e9800998ecf8427e

但脚本返回的哈希是:

85bd946a585af9fd3fb9eda68707c1d8

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

【问题讨论】:

  • my version of PHP PHP7 ?
  • 我运行了它,它吐出了一大堆undefined indexes,所以我就放弃了。
  • 嗨,不幸的是,我运行的是旧版本 - 5.3.28 但是,它仍应返回真正的 MD5 哈希。不要以为你能告诉我这个脚本是否在 7 中返回一个真正的 MD5 哈希?
  • 您是否寻找过其他开源 MD5 项目?由于它只是用于教育,而且它不完全是一个小众算法,我猜你可以找到其他开箱即用的东西,你可以从中学习
  • @alexanderbird 是的。不乏关于 MD5 的信息,我已经阅读了 Rivest 的原始备忘录。从另一种语言转译也没有解决这个脚本的奥秘。令人惊讶的是,我还没有找到一个可以遵循 1 个示例的来源 - 这会很有帮助。

标签: php security hash md5 md5-file


【解决方案1】:

此脚本未返回真正的 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)));

【讨论】:

    猜你喜欢
    • 2013-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-08
    • 1970-01-01
    • 1970-01-01
    • 2010-12-05
    • 1970-01-01
    相关资源
    最近更新 更多