我怎么能与random.seed相反?

时间:2016-01-25 18:52:49

标签: python

def encrypt(message, key):
    random.seed(key)
    l = range(len(message))
    random.shuffle(l)
    return "".join([message[x] for x in l])

这是加密方法,我的任务是找出如何解密它。我了解random.seed(key)将按键的值安排随机化。

我该如何扭转呢?

3 个答案:

答案 0 :(得分:5)

首先,这不是完全加密。它在洗牌。如果你这样做,你绝对不应该考虑你的信息"安全"。我确信有很多非常聪明的人可以弄清楚你的消息最初说的是什么......

如果您知道随机种子,那么您正在寻找一种方法来取消洗牌。这个在单个python进程中是可能的(如果你知道密钥):

import random
def shuffle(message, key):
    random.seed(key)
    l = range(len(message))
    random.shuffle(l)
    return "".join([message[x] for x in l])

def unshuffle(shuffled_message, key):
    random.seed(key)
    l = range(len(shuffled_message))
    random.shuffle(l)
    out = [None] * len(shuffled_message)
    for i, x in enumerate(l):
        out[x] = shuffled_message[i]
    return ''.join(out)


hello_world = shuffle('Hello World', 0)
print hello_world
print unshuffle(hello_world, 0)

这个想法是random.shuffle将从一个索引映射到另一个索引。它伪随机地执行此操作,这意味着它在给定相同种子的情况下始终表现相同。那么,诀窍就是弄清楚如何反转这种映射。

答案 1 :(得分:1)

你可以轻松解密这个你只需要反转索引(假设你使用相同的密钥):

def decrypt(message, key):
    random.seed(key)
    l = list(range(len(message)))
    random.shuffle(l)
    return "".join(message[i] for i, x in sorted(enumerate(l), key=lambda x: x[1]))

>>> decrypt(encrypt('Hello World', 0), 0)
'Hello World'

答案 2 :(得分:0)

def decrypt(shuffled_msg, key):
    random.seed(key)
    l = range(len(shuffled_msg))
    random.shuffle(l)
    d = sorted(zip(l, shuffled_msg))
    return ''.join([b for (a, b) in d])

>>> key = 14
>>> shuffled = encrypt('somestring', key=key)
>>> shuffled
'essmigntro'
>>> decrypt(shuffled, key=key)
'somestring'