关于穷举一个字符串的 MD5 是他自己的想法

2016-10-04 20:59:24 +08:00
 liqingcan

前几天看了站中的一个帖子传送门 简单的说就是一个文本文件中的内容是这个文件的 md5 ,有没有可能找出这个 md5 值,然后我好奇心就起来了,于是我想动手验证一下。 我一开始的想法是,创建一个文本文件,然后计算他的 md5 ,但是感觉频繁的创建文件好像有点伤硬盘,于是我就试验了一下,直接计算一个字符串的 md5 和将这个字符串放在文本文件中在计算 md5 是不是一样。如果一样的话我就不用频繁创建文件了,经过试验这个是可行的。 然后我就写了一小段 python 的脚本来进行验证。 代码:

import hashlib
import time

if __name__=="__main__":
    i=0
    md5 = format("%f"%time.time())
    while(True):
        i = i+1
        m=hashlib.md5()
        m.update(md5.encode("utf8"))
        temp = m.hexdigest()
        print("%d\t%s md5-> %s"%(i,md5,temp))
        if(temp==md5):
            print("找到一个相同的了,回车继续")
            print(md5)
            input()
            md5 = temp+format("%f"%time.time())
        else:
            md5 = temp

简单的说,就是先取当前时间作为初始字符串,然后计算 md5 接着将计算出来的 md5 再计算,一直循环到找到一样的,然后我就放到了一台闲置的腾讯云的主机上跑了十几个小时

跑了有快 4 千万条数据了。 然后我现在就在想,我这个方法有没有可能进入死循环啊?

5135 次点击
所在节点    问与答
50 条回复
Trim21
2016-10-05 00:46:36 +08:00
@GoForce5500 减少到了 17 年...
loveyu
2016-10-05 00:48:29 +08:00
来个全民计算的活动。先将要计算的字符串拆成一亿份,各种机器像挖矿一样计算就好了,说不定几天就有结果了
dynos01
2016-10-05 00:58:35 +08:00
搞一大堆超算,利用上大量的计算资源,也许很快出结果
可惜这种项目没什么实际用处吧。。。
abelyao
2016-10-05 01:00:01 +08:00
@loveyu 想起了 SETI@home 计划…… 我是不是暴露年龄了
YvesX
2016-10-05 01:10:29 +08:00
你都定义为“穷举”了,为什么要用这种奇怪的算法,还是说其实是想顺便找个循环节出来?
要是真的穷尽了,你就知道了所有 md5()与 md5(md5())的一一映射……
脑洞有趣,但有点烧算力啊……
liqingcan
2016-10-05 01:56:16 +08:00
@YvesX 就是因为穷举数量太多了,所以用了这个,说不定踩到狗屎运就跳出来了………
RqPS6rhmP3Nyn3Tm
2016-10-05 01:58:34 +08:00
不要那 python 做,性能太烂了
关于你的问题,是的。
StarBrilliant
2016-10-05 03:42:27 +08:00
1 、存在 md5(x) == x 的概率是 63.21%,这是一个很大的概率
2 、但是我们找不到这些 x ,因为对任意一个 x , md5(x) == x 的概率是 0.0000000000000000000000000000000000002939%
3 、 MD5 的设计使你无法理论预测这样一个 x 值,所以你需要实际计算
4 、如果计算一次 MD5 需要 1 ms 时间的话,你需要 10790283070806014188970529154.99 年才能算出来

综上所述,研究这个问题没有意义。
以及,搞计算机这一行,先学好数学,再买个游标卡尺来写 Python (误)。

参考:
http://crypto.stackexchange.com/a/19579
http://stackoverflow.com/a/235788/2557927
ryd994
2016-10-05 08:11:41 +08:00
@GoForce5500 远远不够啊
md5 有 2^128 个
13M≈2^24
要 2^104 秒啊………
t0byxdd
2016-10-05 09:41:34 +08:00
print 很慢的 不要这么频繁输出没意义的内容 最好别用 python 或者至少弄个多进程并行
lain0
2016-10-05 10:19:05 +08:00
xuboying
2016-10-05 10:38:10 +08:00
import numba
waruqi
2016-10-05 11:01:05 +08:00
拿 py 来跑也是醉了
wy315700
2016-10-05 13:54:13 +08:00
至少也得拿个显卡来穷举
SlipStupig
2016-10-05 16:06:54 +08:00
@t0byxdd 这种算数密集型好像多进程也没啥用,直接上 CUDA 或者 OpenGL ,速度不知道比 CPU 快多少
ipwx
2016-10-05 16:49:48 +08:00
@sneezry 牛顿迭代?。。。数学不好就不要乱用术语。
sneezry
2016-10-05 18:07:13 +08:00
@ipwx 那我虚心求教,这在数学上的专业术语应该叫什么呢
ipwx
2016-10-05 20:16:19 +08:00
@sneezry 没什么术语,只是在寻找不动点而已。

而且就算 MD5(x)=x 存在不动点,也不一定能通过楼主的方法找到,因为毕竟如果 MD5 的自变量空间里面存在某个不与不动点相通的环,而楼主恰巧从这个环的某个元素出发开始迭代,那么永远都只能在这个环里面走,到达不了不动点。
sneezry
2016-10-05 23:23:16 +08:00
@ipwx 牛顿法是找 0 点的方法,同样用到了迭代,楼主的问题稍加变化就从 f(x)=x 转换为 F(x)=f(x)-x ,继而变成 0 点问题。牛顿法是用切线与 x 轴交点作为下次计算的输入值,楼主用的是函数值。那么我说这是一个特殊情况的牛顿逼近又有什么不妥呢?
yangff
2016-10-05 23:33:54 +08:00
@sneezry 来写一下 md5'(x)=?吧

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/310571

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX