我一直在为一个编码项目解决一个难题
我有一条加密信息,用替换密码加密。非常简单,基本上是a = x, b = e, c = g
,等等
我做了一个交换功能,完全可操作,按计划工作
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
但正如您所料,这有一些错误。它甚至在一次迭代中都不会解读它
也许你们中的一位可以从蛮力密码程序中获得灵感。如果你没有时间回答,不要担心。但如果你能帮忙,我会很感激的
如果您确实拥有密码的密钥,即,如果您知道要将哪个字母映射到哪个字母,则最好将其写在字典中,并通过dict运行加密消息。由于字符串是不可变的,并且使用str.replace会替换得太频繁,因此最好先将字符串转换为列表:
如果您没有密钥,那么暴力不是最好的方法,因为要使用暴力,您需要创建26!,i、 e.26*25*……*2*1、字典和通读所有可能的解密(如果加密区分大小写,甚至有52个可能的映射,不包括空格、冒号、数字、问号等)
然后,您应该尝试查看加密消息和未加密文本的相对频率,以确定可能的候选消息。例如,如果在加密文本中,“x”占你信件的15%,那么它很可能是“e”的候选者,以此类推
我希望这是有帮助的
如果
decryption_key
是密码的密钥,其中它只是字符串“abcde…xyz”替换为解密密钥中对应的字符串(例如,“zyx…edcba”,如果密钥正好与字母表相反),则将产生结果。现在,使用你尝试过的策略
将生成所有可能的解密密钥。这根本行不通,它的复杂性是O(n!),这里的n是26,字母表中的字母数。即使这个过程真的起作用了,你也永远不会想要n!算法的复杂性。您应该放弃让它工作的尝试,并尝试找出解决方案,但我上面的代码将为您产生结果,而不是在我们的有生之年
相关问题 更多 >
编程相关推荐