随机数密码破解
起因
当然不是什么新发现。。。
事情的起因是,一个同学在朋友圈发表了一个状态,表示他因忘记旅行箱密码而暴力破解,尝试300次后成功破解。
回复区里大家对他的密码到底是什么展开了讨论,有人认为他从000开始尝试,300次后应该密码是299。也有人认为300是个粗略的估计,可能是300多也可能是280+。
我比较认同300是一个粗略估计的说法,但事实上人在暴力破解自己的密码时,往往会优先尝试自己常用的组合形式而非从000一直干到999。
在这个前提之下,也就没有必要真的去研究这位朋友的密码到底是多少了,但是这反倒让我更有兴趣去了解一下暴力破解密码的技巧。比如说,这个密码箱的密码你是不知道的,而其主人不是一个随随便便将自己生日或者000作为密码的人,那么如果你采用每次用一个均匀分布随机数来破解密码,300次可以破解的概率是多少呢?
问题更加直观的表达是,口袋里有1000个均质小球,外观质量相同,一个是黑色球,999个白色球,每次取出一个,300次取出黑色球的概率是多少。
这里我故意含糊其辞,原因是这样的,这个问题可以是“A:300次以内取出黑色小球的概率”,也可以是“B:在第300次时取出黑色小球的概率”。
A与B是两种不同的概率问题,虽然同属古典概率模型,但计算方法不同,下面逐一分析。
A问题
A问题的计算方法可采用集合进行计算,即全集是“1000个球中取300个”,关注的子集为“300个球中,包含所有1个黑球中的1个黑球和999个白球中的299个白球”,所以MATLAB计算这个问题:
p=nchoosek(1,1)*nchoosek(999,299)/nchoosek(1000,300);
结果是0.3
B问题
B问题就不同了,它指的是刚好在第300次抽中,这就意味着要经历299次失败之后才能抽中,MATLAB的解答是:
N=1000;
p=1;
for i=1:299
p=p*(1-1/N);
N=N-1;
end
p=p/N;
结果是0.001
结论
有趣的是,绕了一大圈发现第300次抽中黑球和第一次抽中黑球概率是相同的,是不是很有意思!然而这个问题早已被人发现,就像抓阄一样,第一个抓的人和第一百个抓的抓到奖品的概率实际上是相同的。
而A问题的结论则表明,这个概率就是等于300/1000,绕了一圈也白绕了。也就是说实验的次数与成功概率成正比例。