在python中解密编码消息



我有一个难题,我一直试图解决一个编码项目。

我有一个打乱的消息,打乱了一个替换密码。非常简单,基本上是a = x, b = e, c = g,等等。

我做了一个swap函数,完全可操作,按计划工作。

def swap(letter1, letter2):
counter = 0
letter1List = []
letter2List = []
for i in range(len(s)):
if s[counter] == letter1:
letter1List.append(counter)
counter += 1
counter = 0
for i in range(len(s)):
if s[counter] == letter2:
letter2List.append(counter)
counter += 1
x = 0
for i in range(len(letter1List)):
s[letter1List[x]] = letter2
x += 1
x = 0
for i in range(len(letter2List)):
s[letter2List[x]] = letter1
x += 1

我一直试图让它与各种FOR循环一起工作,以生成所有可能的交换选项,希望至少在一个输出中解开消息。

目前为止我能想到的最好的办法就是这样的


chars = "abcdefghijklmnopqrstuvwxyz"
x = 0
for i in range(len(chars)):
y = 0
for i in range(len(chars)):
swap(chars[x], chars[y])
print(message)
y += 1

x += 1

但是正如您所料,这有一些错误。它甚至在一次迭代中都没有对它进行解码。

也许你们中有人可以从暴力破解密码程序中获得灵感。如果你没有时间回答,不要担心。但如果你能帮忙,我将不胜感激。

如果您确实拥有密码的密钥,也就是说,如果您知道要将哪个字母映射到哪个字母,那么最好将其写入字典并通过字典运行加密消息。由于字符串是不可变的,使用str.replace会频繁替换,因此最好先将字符串转换为列表:

decryptDict = {"a":"f", "b":"p",...} 
L = list(encryptedMessage)
for i in len(L):
L[i] = decryptDict[L[i]]

如果你没有密钥,那么蛮力不是最好的方法,因为要蛮力你需要创建26!,即26 * 25 *…* 2 * 1,字典和读取所有可能的解密(如果加密是区分大小写的,甚至有52!可能的映射,不包括空格,冒号,数字,问号等)。

然后你应该试着看看加密信息和未加密文本的相对频率,以建立可能的候选者。例如,如果在加密文本"x"占你信件的15%,那么它很可能是";e&;"等等

我希望这是有帮助的

如果decryption_key是密码的密钥,其中它只是字符串"abcde…xyz"替换为解密密钥中相应的对应项(例如。"zyx股票……edcba"如果键正好与字母表相反),则

decrypted_string = "".join([decryption_key[ord(x) - 97] for x in encrypted_string])

将产生结果。现在,使用您尝试过的策略,

from itertools import permutations
possible_keys = permutations(list("abcdefghijklmnopqrstuvwxyz"))

将产生所有可能的解密密钥。这根本行不通,它的复杂度是0 (n!)这里的n是26,字母表中的字母数。即使这个过程可行,你也不会想要n!是一个算法的复杂度。你应该放弃尝试让它工作,并尝试推理出一个解决方案,但我上面的代码将为你产生结果,只是不是在我们的有生之年。

最新更新