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)
将按键的值安排随机化。
我该如何扭转呢?
答案 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'