这是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。
运行示例:
calc_success_probability(80603140212, 2400, 40000000)
返回0.6055。
我很难将其转换为Python。在Python 3中,不再有最大整数,所以N这不是问题。我认为在计算中,我必须将所有内容强制设置为较大的浮点数,但我不确定。
我也不知道MATLAB中的运算顺序。我认为代码是这样说的:
创建大小为[1 .. 10]的数组,以便十个元素用零初始化该数组的每个元素
在基于零的索引中,我认为这是array[0 .. t-1],就像MATLAB使用1作为第一个(第0个)索引一样。
然后将数组的第二个元素(基于0的索引)初始化为m。
对于数组中的每个元素,pos=1(从0开始的索引)为t