解读python中的编码消息

解读python中的编码消息,python,encryption,Python,Encryption,我一直在为一个编码项目解决一个难题 我有一条加密信息,用替换密码加密。非常简单,基本上是a=x、b=e、c=g等等 我做了一个交换功能,完全可操作,按计划工作 def交换(字母1、字母2): 计数器=0 字母1列表=[] letter2List=[] 对于范围内的i(len(s)): 如果s[计数器]==字母1: 字母1列表。附加(计数器) 计数器+=1 计数器=0 对于范围内的i(len(s)): 如果s[计数器]==字母2: 字母2列表。附加(计数器) 计数器+=1 x=0 对于范围内的i(

我一直在为一个编码项目解决一个难题

我有一条加密信息,用替换密码加密。非常简单,基本上是a=x、b=e、c=g等等

我做了一个交换功能,完全可操作,按计划工作

def交换(字母1、字母2):
计数器=0
字母1列表=[]
letter2List=[]
对于范围内的i(len(s)):
如果s[计数器]==字母1:
字母1列表。附加(计数器)
计数器+=1
计数器=0
对于范围内的i(len(s)):
如果s[计数器]==字母2:
字母2列表。附加(计数器)
计数器+=1
x=0
对于范围内的i(len(字母列表)):
s[字母1列表[x]]=字母2
x+=1
x=0
对于范围内的i(len(letter2List)):
s[letter2List[x]]=letter1
x+=1
我一直在尝试让它与各种FOR循环一起工作,以生成每个可能的交换选项,希望至少在一个输出中解读消息

基本上,到目前为止,我最好的想法是这样的


chars=“abcdefghijklmnopqrstuvxyz”
x=0
对于范围内的i(len(chars)):
y=0
对于范围内的i(len(chars)):
交换(字符[x],字符[y])
打印(信息)
y+=1
x+=1
但正如您所料,这有一些错误。它甚至在一次迭代中都不会解读它


也许你们中的一位可以从蛮力密码程序中获得灵感。如果你没有时间回答,不要担心。但是如果您能帮忙,我们将不胜感激。

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

decryptDict = {"a":"f", "b":"p",...} 
L = list(encryptedMessage)
for i in len(L):
    L[i] = decryptDict[L[i]]
如果您没有密钥,那么暴力不是最好的方法,因为要使用暴力,您需要创建26!,i、 e.26*25*……*2*1、字典和通读所有可能的解密(如果加密区分大小写,甚至有52个可能的映射,不包括空格、冒号、数字、问号等)

然后,您应该尝试查看加密消息和未加密文本的相对频率,以确定可能的候选消息。例如,如果在加密文本中,“x”占你信件的15%,那么它很可能是“e”的候选者,以此类推


我希望这是有帮助的

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

decryptDict = {"a":"f", "b":"p",...} 
L = list(encryptedMessage)
for i in len(L):
    L[i] = decryptDict[L[i]]
如果您没有密钥,那么暴力不是最好的方法,因为要使用暴力,您需要创建26!,i、 e.26*25*……*2*1、字典和通读所有可能的解密(如果加密区分大小写,甚至有52个可能的映射,不包括空格、冒号、数字、问号等)

然后,您应该尝试查看加密消息和未加密文本的相对频率,以确定可能的候选消息。例如,如果在加密文本中,“x”占你信件的15%,那么它很可能是“e”的候选者,以此类推


我希望这是有帮助的

如果
decryption\u key
是密码的密钥,它只是用解密密钥中对应的字符串“abcde…xyz”替换的,那么

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

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

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

如果
decryption\u key
是密码的密钥,它只是用解密密钥中对应的字符串“abcde…xyz”替换的字符串(例如“zyx…edcba”)如果键正好是字母表的倒数),则

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

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

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

至少需要注意一点:看起来您可以在外部for循环中使用
x
而不是
i
,因为它们似乎满足相同的目的。我也有点困惑:您只需要接收一个字符串,并用解密密钥中的对应字符替换每个字符?如果是这样的话,你就不必在加密字符串上迭代多次了,关键是我不知道密钥。bug并不是最大的问题,我将研究x的问题though@knosmos没错,哈哈哈。如果你想这样做:
list(itertools.permutations(“abcdefghijklmnopqrstuvwxyz”)
会给你所有可能的键,但它不会在你有生之年完成哈哈!=26 * 25 * 24 * 23 ... * 字母
a
有26种可能的互换<代码>b有25个(26减去
a使用的那一个)
c
有24种可能性,以此类推,因此