关于穷举一个字符串的 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 千万条数据了。 然后我现在就在想,我这个方法有没有可能进入死循环啊?

4937 次点击
所在节点    问与答
50 条回复
jasontse
2016-10-04 21:10:30 +08:00
用十六进制数自增,补齐 32 位,跑一遍直到全 F ,这样就不会死循环了,不过还有大小写的可能性。😂
skydiver
2016-10-04 21:10:36 +08:00
找到一个循环也很有价值啊
bkmi
2016-10-04 21:11:57 +08:00
哥们,你好歹也多起几个线程啊
bearqq
2016-10-04 21:15:00 +08:00
md5 多少位?每位哪些可能性?
弄一堆 for
就可以完成史诗级的巨慢解
可保证唯一。

不要拿 python 做这种蠢事,那才真是拍脑袋写个程序一秒钟,运行起来跑死个人
yangff
2016-10-04 21:15:42 +08:00
就算你这样跑出来了,得到的也是
hex(x) == hex(md5(hex(x)))
而不是
x == md5(x)
aploium
2016-10-04 21:33:51 +08:00
用 py 做这种事......简直 gg

歪楼的 ps: 不输出 stdout 能快很多
popok
2016-10-04 21:48:55 +08:00
py 算这个效率太低了,再说你还要输出,那。。。。。
liqingcan
2016-10-04 21:53:59 +08:00
@jasontse 我本来是这样想的,不过想想,好像写起来比较麻烦
@skydiver 重点是,找到死循环我也不知道是哪一个。。。
@bkmi 我觉得同一个脚本直接多次执行不就行了,不过我一个就沾满了腾讯云主机 100%cpu 感觉没有多开的必要
@bearqq
@aploium
@popok 用 python 主要是写起来快,哈哈
@yangff 为啥?hex 是什么东西?
metowolf
2016-10-04 22:07:24 +08:00
显然会有循环节的,只是不知道大还是小,如果找到 md5(x)==x 就比较有价值了
binux
2016-10-04 22:08:01 +08:00
@yangff
hex(x) == hex(md5(hex(x)))
不就是
x` == hex(md5(x`))

而 md5 大多数时候就是 hex(md5(())
zhujinliang
2016-10-04 22:27:06 +08:00
用 GPU 跑啊
liqingcan
2016-10-04 22:32:54 +08:00
@metowolf
@binux 表示数学不好的看不懂你俩讲的是啥……
@zhujinliang 不会搞。尴尬~
sherlocktheplant
2016-10-04 22:33:56 +08:00
@liqingcan md5(string) != md5(hex(string))
sneezry
2016-10-04 23:28:00 +08:00
要先证明函数收敛才能这么搞,楼主你其实在做牛顿迭代,这个有解是有前提条件的
lance6816
2016-10-04 23:36:00 +08:00
可以的,很强势
大概到太阳变成红巨星那天就能算出来了
nfroot
2016-10-04 23:51:43 +08:00
先读源码吧 或许你就能猜到有木有这种可能存在
liqingcan
2016-10-05 00:37:56 +08:00
@sneezry
@lance6816
@nfroot 额,好吧,其实我就是心血来潮想试试。
@sherlocktheplant 我比较想知道 hex ()这个是什么?
Trim21
2016-10-05 00:37:58 +08:00
写了个穷举算法.........计算 1e6 个数字要 2s,穷举完要 6e36 年,多不多进程也没啥意义了...
换了 pypy2 居然更慢了!变成了 5s
liqingcan
2016-10-05 00:38:35 +08:00
@sherlocktheplant 好吧,懂了, 16 进制
GoForce5500
2016-10-05 00:39:40 +08:00
Java 不输出结果仅做 MD5 计算和计数的话,在 RMBP15 上开 8 核多线程跑满 CPU ,可以达到 1300 万次 MD5/秒。
堆 GPU 的话还能快两个数量级。

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

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

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

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

© 2021 V2EX