[英]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.