选择弦作随机种子对输出的影响

时间:2014-10-08 02:38:04

标签: python python-2.7 cryptography permutation

在python中,为了排列字符串的字母,可以写

import random
random.seed(str_key)
length = range(len(original_str))
random.shuffle(length)
join "".join([original_key[idx] for idx in length])

我想知道种子对关键字符串做了什么以及它如何从它产生排列(或者说shuffle怎么做)。例如,如果我把键作为'hGd'我如何获得特定输出,而如果我写另一个键如'AGd'我会得到另一个输出?

编辑:我尝试在该代码上使用的解密算法是:

for key in itertools.product(*3*[string.ascii_letters]):
    indices = range(len(enc_msg))
    list_encrypted_msg = list(enc_msg)
    random.seed(key)
    random.shuffle(indices)
    decrypted = ""

    for idx in indices[::-1]:
        decrypted += list_encrypted_msg[idx]

    try:
        if not decrypted.index("The"):
            print decrypted
    except ValueError:
        continue
return "not found!"

1 个答案:

答案 0 :(得分:1)

我首先要注意你发布的代码有点令人困惑!消息永远不会被命名,但我认为你的意思是原始字符串。所以我们很好。你的问题也令人困惑。你问的是随机数发生器种子是什么?因为那很容易。但是如果你问如何使用'hGd'种子发生器得到'AGd'种子发生器的输出,这应该是不可能的,因为'hGd'不是'AGd'的排列,反之亦然。他们根本不在同一组排列中!但假设它们是,如果你要求多少次迭代,你需要获得相同的输出(或者一个碰撞,换句话说),这取决于实现和算法等等。也许值得研究python的随机模块的细节;我承认我个人不知道。

但是对于播种,我们可以例如编写一个伪随机数生成器,但迭代地应用等式y = 5*x + 77 mod 100(当然,就随机数生成器而言,这将是非常垃圾)。每次调用的输出将是应用于输入的等式。但显然这取决于x的初始值是什么,指定了一整类生成器!通常,这是一个随机种子,它是从整个过程开始的x的值。现在查看文档:{​​{3}}我看到随机种子实际上可以是任何可清除对象。因此,如果你输入一个字符串,它首先要做的是将一些哈希函数应用于字符串,以便为伪随机数生成器获取合适的种子,当然,其中适合相对于特定伪随机数的实现数字生成器。

如果我误解了你的问题,请接受我的谦卑道歉。

编辑:PM 2Ring打败了我,他的回答更好。见他的。