繁体   English   中英

我该如何做random.seed的对立面?

[英]How can i do the opposite of random.seed?

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)将按random.seed(key)的值安排随机化。

我该如何扭转呢?

首先,这不是完全加密。 洗牌 如果这样做,则绝对不应认为您的消息“安全”。 我敢肯定那里有很多非常聪明的人,他们可以弄清楚您的信息最初所说的是什么...

如果您知道随机种子,那么您正在寻找一种对混洗过的东西进行混洗的方法。 这可能一个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将从一个索引映射到另一个索引。 它是伪随机执行的,这意味着在给定相同种子的情况下,它将始终以相同的方式运行。 因此,诀窍就是弄清楚如何反转该映射。

您可以轻松解密它,而只需反向索引即可(假设您使用相同的密钥):

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'
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'

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM