免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12345下一页
最近访问板块 发新帖
查看: 12160 | 回复: 47
打印 上一主题 下一主题

[加密] 一道最难的PHP题(md5_file) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-01-15 10:03 |只看该作者 |倒序浏览

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

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

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

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

  11. 好吧,现在正式开始!

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

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

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

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

复制代码

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

论坛徽章:
0
2 [报告]
发表于 2006-01-15 11:12 |只看该作者
大哥你真行,差点被你呼忧了....

论坛徽章:
0
3 [报告]
发表于 2006-01-15 14:51 |只看该作者

  1. <?php
  2. $x = '?';
  3. $target = md5_file(__FILE__);
  4. $file = file(__FILE__);
  5. $file[1] = sprintf("\$x = '%s';\n", $target);
  6. $fp = fopen(__FILE__, "w");
  7. foreach ($file as $value)
  8. {
  9.         $ret = fwrite($fp, $value);
  10.         if (!$ret)
  11.         {
  12.                 die("crash!!!");
  13.         }
  14. }
  15. fclose($fp);
  16. $aLine = explode("=", $file[1]);
  17. $x = trim($aLine[1]);
  18. $x = substr($x, 1, -2);
  19. $x == $target ? print('congratulation!'):die('error');
  20. ?>
复制代码

论坛徽章:
0
4 [报告]
发表于 2006-01-15 15:17 |只看该作者
楼上的显然不是答案!

呵呵

论坛徽章:
0
5 [报告]
发表于 2006-01-15 16:59 |只看该作者
这个问题有意思,有时间再想想.
不过如果用来做防盗的验证是没多大用处,因为一但有这种算法(想穷举也未必举得出),别人也可以用同样的算法将篡改后文件算出MD5值.

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

论坛徽章:
0
6 [报告]
发表于 2006-01-15 19:02 |只看该作者
XP2+APACHE2.0+php5


  1. t1.php
  2. <?php
  3. include("t2.php");
  4. echo "<BR>";
  5. $md5_value=md5_file(__FILE__);
  6. if($md5_value==$f_md5)
  7. echo "OK!!";
  8. else
  9. echo "SEE YOU!!";
  10. ?>
  11. //-------------------------------
  12. t2.php
  13. <?php
  14. $file="t_1.php";
  15. $f_md5=md5_file($file);
  16. //echo $f_md5;
  17. ?>
复制代码


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


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


  1. t1.php
  2. <?php
  3. $f_md5=md5_file(Remote_file_URI);
  4. echo "<BR>";
  5. $md5_value=md5_file(Local_file_URI);
  6. if($md5_value==$f_md5)
  7. echo "OK!!";
  8. else
  9. echo "SEE YOU!!";
  10. ?>
复制代码

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

论坛徽章:
0
7 [报告]
发表于 2006-01-16 00:39 |只看该作者
楼上的挺有趣的,动态取MD5值,永远是恒等的,喜欢怎么改都行.
还远程取值?难道你认为经过解析器出来的东西一样,解析前的源码也一样?

论坛徽章:
0
8 [报告]
发表于 2006-01-16 00:45 |只看该作者
稍微懂点哲学的都能知道这是无解的..........

论坛徽章:
0
9 [报告]
发表于 2006-01-16 05:41 |只看该作者
原帖由 crazysoul 于 2006-1-16 00:39 发表
楼上的挺有趣的,动态取MD5值,永远是恒等的,喜欢怎么改都行.
还远程取值?难道你认为经过解析器出来的东西一样,解析前的源码也一样?


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

论坛徽章:
0
10 [报告]
发表于 2006-01-16 08:49 |只看该作者
此题无任意意义!!!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP