今日新玩具:n.closeai.moe
最近瞎探索Hash相关的内容和思考比较多一些。没遍历完,但看了一些资料的特定章节,比如 NIST FIPS 180-4 和 RFC 6234。
也体验了几个“可视化”的工具,如 hashexplained.com/sha256 、 stepansnigirev.github.io/visual-sha256 和 sha256algorithm.com
MD5相较于SHA256要“好玩些”,可能是位宽看起来没有那么绝望吧。但实际上搜索空间大了也是瞎忙活。脑袋不灵光有时候想法写出来后才发现其实是等效第二原像攻击。即便足够令我绝望亿万次的概率已经计算出来了,但还是忍不住尝试一下,手动改种子去“随机漫步”。当然奇迹并不会发生,运气也没好到找出一对SHA256的自然碰撞,少了一次发论文的机会。
“本字符串的 SHA-256 值是以 496931fd 开头的”这个字符串的SHA-256是:496931fd7f70d9b23b63191d2842ddfc868191087a45ea20ff1698cc5198c705
这种是匹配前缀,有点“自指预言”的意味,爆破难度和位宽有关,但起码是能够预期的。相对来说比较简单。
除了难度,成功率也是可以预估的,496931fd长度是32bit,遍历完32bit后能找到1组满足预言的字符串的概率约63.21%。不过我运气比较好,跑了一轮不需要加nonce就成功了。
而后面我想找的是”本字符串的 SHA-256 值是以 xxxxxxxxxx 开头的”,其中xxxxxxxxxx是纯数字。这个难度和成功率就剧增了,遍历10位数字一轮需要大概5分钟时间,每轮成功率只有0.9%,因为Hex每一位有16种可能,限定只能有数字之后,成功率就会暴跌。
↑所以这个昨晚挂机一晚上也没碰上。每轮相当于一次独立的伯努利试验,那么昨晚跑了117轮(自动加nonce)后依旧还是有约34.6%的概率失败。想要达到90%的胜率,接下来还需要跑138轮,而想要达到99%胜率,还需要跑393轮。还好我也做了checkpoint,所以有时间还可以继续挑战。
﹥
回到今日新玩具,实际上是一个 Numeric MD5 Orchard 展示页,我找到了约53万条满足这个条件的数据:A和B都是32位数字,且 B=MD5(A)。也就是说我找到了一些MD5前后都是32位数字的对。这个检索起来比较简单,但我想要的其实是A→B→C都是纯数字的情形,目前还没碰上。这个“成功率”也是可以预测的,我现在只找到53万条B,那么所有MD5(B)中出现纯数字的概率是14.4%,换言之,我想要找到这个C,需要继续搜集B,当B的数量达到785万时,我就有90%的把握抓到一条C。这可能得挂上一周时间。
不过已经找到的53万条丢掉也有点浪费,就做了个网页展示出来吧。(图一乐,不要用来做密码了)。
﹥
Hash的魅力在于这种令人绝望的不可逆性(虽然MD5已经不安全了)。这种“绝望”其实日常我也会体会到,有时候脑海里会出现一个“点子”,但这个点子似乎一瞬间被Hash了,然后拼尽全力也想不起来点子的原相是什么。这种似乎抓到又抓不到的体验真的和碰撞Hash类似。
而哈希确定性与雪崩效应就有点像“命运”。假如可以用有限的符号代表一个人(先天),又能用有限的序列代表这个人一生的所有行动,那么这拼接起来后哈希的结果就是“一生的评价”,或者说结局之类的玩意儿。不同人的结局又很多很多,但又是有限的。不同的人有不一样的结局,同一个人做出不同的行动也会导致不同的结局,很奇妙。
大家小时候可能玩过的一款叫做“MD5大作战”的flash游戏。大概就是这种感觉,确定的名字A与确定的名字B“大战”后的结果就是确定的。在游戏中可能有办法遍历出一个非常强大胜率很高的名字,但现实中我们却无法想象出一个最强的自己。我们可能能看到一些拥有“好结局”的人,但即便我们把这个人从出生到死亡的每一个比特都照抄,那结局也会完全不一样,因为人与人之间的Prefix本来就不一样。
不过我想这个名为“命运”的哈希算法,是有缺陷但未被完全破解的那类。每个人都可以通过主观选择,去行动,慢慢在路径上接近自己想要的结果。可能纵观整辈子确实是“雪崩”的,但在每一层运算中,也是有些“有迹可循”、能够主观选择和构造的环节。
