解读python中的编码消息

2024-09-21 14:08:02 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我有一条加密信息,用替换密码加密。非常简单,基本上是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

但正如您所料,这有一些错误。它甚至在一次迭代中都不会解读它

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


Tags: in密码编码forlenifcounterrange
2条回答

如果您确实拥有密码的密钥,即,如果您知道要将哪个字母映射到哪个字母,则最好将其写在字典中,并通过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_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"))

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

相关问题 更多 >

    热门问题