axgle 发表于 2006-01-15 10:03

[加密] 一道最难的PHP题(md5_file)


一道最难的PHP题(md5_file)
作者:axgle 水成

了解php的一般都知道md5的作用.但也许你还不知道,还有另外一个和
md5类似的php函数,叫md5_file,该函数把某个文件的内容进行md5计算,
并返回和md5函数相同的结果.

md5_file函数可以用作'文件传输完整性'的验证之用。若某文件在网络传输中被非法修改,
则其md5值必定发生改变.当原始的md5值和当前的md5值不一致时,我们就知道该文件已经
被修改过了.可见,md5_file函数还是挺有用的.

md5_file函数使用方法很简单,这里就不多说了.我在这里提出一个关于md5_file函数的难题。
欢迎敢于挑战者加入到'破解难题'的游戏中来。

好吧,现在正式开始!

设想一个PHP脚本,我们想办法把这个PHP脚本本身的md5值求出来(这很容易,不是吗?),但同时
这个md5值要放在这个PHP脚本中,并且在这个PHP脚本自身中进行完整性验证!这便是我称为的
'最难的PHP题'.

以上题目,可以用标准的PHP代码书写如下:

<?php
//author:axgle <axgle@126.com>
$x='?';
$target=md5_file(__FILE__);
$x==$target?print('you are excellent.congratulation!'):die('error');
?>

题目要求寻找$x的值,当您找到一个字符串,代替$x后面的'?'后,再运行上面的脚本,
若输出是'you are excellent.congratulation!',那么恭喜您,答对了,您将是全球最棒的~~~



[ 本帖最后由 HonestQiao 于 2006-7-24 20:23 编辑 ]

wobushiwo 发表于 2006-01-15 11:12

大哥你真行,差点被你呼忧了....

kofwang 发表于 2006-01-15 14:51


<?php
$x = '?';
$target = md5_file(__FILE__);
$file = file(__FILE__);
$file = sprintf("\$x = '%s';\n", $target);
$fp = fopen(__FILE__, "w");
foreach ($file as $value)
{
      $ret = fwrite($fp, $value);
      if (!$ret)
      {
                die("crash!!!");
      }
}
fclose($fp);
$aLine = explode("=", $file);
$x = trim($aLine);
$x = substr($x, 1, -2);
$x == $target ? print('congratulation!'):die('error');
?>

hightman 发表于 2006-01-15 15:17

楼上的显然不是答案!

呵呵

crazysoul 发表于 2006-01-15 16:59

这个问题有意思,有时间再想想.
不过如果用来做防盗的验证是没多大用处,因为一但有这种算法(想穷举也未必举得出),别人也可以用同样的算法将篡改后文件算出MD5值.

[ 本帖最后由 crazysoul 于 2006-1-15 17:24 编辑 ]

carset 发表于 2006-01-15 19:02

XP2+APACHE2.0+php5


t1.php
<?php
include("t2.php");
echo "<BR>";
$md5_value=md5_file(__FILE__);
if($md5_value==$f_md5)
echo "OK!!";
else
echo "SEE YOU!!";
?>
//-------------------------------
t2.php
<?php
$file="t_1.php";
$f_md5=md5_file($file);
//echo $f_md5;
?>


在t1.php里可以使用判断等语句


如果要涉及到应用,参考phpman(http://cn.php.net/manual/zh/function.md5-file.php)
到5.1.0版本可以 use it with wrappers,所以可以。


t1.php
<?php
$f_md5=md5_file(Remote_file_URI);
echo "<BR>";
$md5_value=md5_file(Local_file_URI);
if($md5_value==$f_md5)
echo "OK!!";
else
echo "SEE YOU!!";
?>


[ 本帖最后由 carset 于 2006-1-15 19:18 编辑 ]

crazysoul 发表于 2006-01-16 00:39

楼上的挺有趣的,动态取MD5值,永远是恒等的,喜欢怎么改都行.
还远程取值?难道你认为经过解析器出来的东西一样,解析前的源码也一样?

SunGod 发表于 2006-01-16 00:45

稍微懂点哲学的都能知道这是无解的..........

carset 发表于 2006-01-16 05:41

原帖由 crazysoul 于 2006-1-16 00:39 发表
楼上的挺有趣的,动态取MD5值,永远是恒等的,喜欢怎么改都行.
还远程取值?难道你认为经过解析器出来的东西一样,解析前的源码也一样?

请注意看,我写的不是MD5文件本身,而是R_F_URI 和 L_F_URI,应用的时候,MD5的是其他文件,
比如一个压缩包什么的。。这个是PHPMAN里的例子,请自己去参考,我已经给出了URL。。。

无喱头 发表于 2006-01-16 08:49

此题无任意意义!!!
页: [1] 2 3 4 5
查看完整版本: [加密] 一道最难的PHP题(md5_file)