这是RainbowCrack作者的一个MATLAB函数:function ret = calc_success_probability(N, t, m)
arr = zeros(1, t - 1);
arr(1) = m;
for i = 2 : t - 1
arr(i) = N * (1 - (1 - 1 / N) ^ arr(i - 1));
end
exp = 0;
for i = 1 : t - 1
exp = exp + arr(i);
end
ret = 1 - (1 - 1 / N) ^ exp;
它计算在给定一个带有键空间N、一个大的无符号整数、长度为t、链数为m的彩虹表中,找到明文密码的成功概率。在
示例运行:
^{pr2}$
返回0.6055。在
我很难将它转换成Python。在python3中,不再有max integer,因此N不是问题。我想在计算中,我不得不把所有的东西都强制到一个大的浮点数上,但我不确定。在
我也不知道MATLAB中的运算顺序。我认为准则是这样说的:
创建大小为[1。。10] 所以十个元素
用零初始化该数组的每个元素
在基于零的索引中,我认为这应该是array[0 .. t-1],看起来MATLAB使用1作为第一个(0'th)索引。在
然后数组的第二个元素(基于0的索引)初始化为m。在
对于数组中的每个元素,pos=1(基于0的索引)到t-1:array[pos] = N * (1 - (1 - 1/N) ** ar