0

这是 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-1

array[pos] = N * (1 - (1 - 1/N) ** array[pos-1]

**电力运营商在哪里。我认为权力^在 MATLAB 中,所以N * (1 - (1-1/N)权力array[pos-1]就像上面那样。

然后设置一个指数。对于数组 0 到 中的每个元素t-1:指数为指数 + 1

返回概率 = 1 - (1 - 1/N)exp 的幂;

我的 Python 代码看起来像这样,并且不起作用。我不知道为什么,但可能是我对 MATLAB 或 Python 的了解不够,或者我在某种程度上读错了数学,而 MATLAB 中发生的事情不是我所期望的,即我的操作顺序和/或类型错误以使其正常工作,而我在这些方面遗漏了一些东西......

def calc_success_probability(N, t, m):

    comp_arr = []

    # array with indices 1 to t-1 in MATLAB, which is otherwise 0 to t-2???
    # range with 0, t is 0 to t excluding t, so t here is t-1, t-1 is up
    # to including t-2... sounds wrong...
    for i in range(0, t-1):
        # initialize array
        comp_arr.append(0)

    print("t = {0:d}, array size is {1:d}".format(t, len(comp_arr)))

    # zero'th element chain count
    comp_arr[0] = m

    for i in range(1, t-1):
        comp_arr[i] = N * (1 - (1 - 1 / N)) ** comp_arr[i-1]

    final_exp = 0
    for i in range(0, t-1):
        final_exp = final_exp + comp_arr[i]

    probability = (1 - (1 - 1 / N)) ** final_exp

    return probability
4

1 回答 1

2

注意你的括号!你已经翻译了这个:

arr(i)      = N * (   1 - ( 1 - 1 / N )     ^  arr(i - 1)     );

对此:

comp_arr[i] = N * (   1 - ( 1 - 1 / N )   ) ** comp_arr[i-1]

我已经把所有东西都排好了,这样你就可以更好地看到哪里出了问题。您已将支架移动到错误的位置。

它应该是:

comp_arr[i] = N * (   1 - ( 1 - 1 / N )     ** comp_arr[i-1]  )

相似地,

ret = 1 - (1 - 1 / N) ^ exp;

不一样

probability = (1 - (1 - 1 / N)) ** final_exp

这应该是

probability = 1 - (1 - 1 / N) ** final_exp
于 2018-09-30T20:22:03.993 回答