Python 中的凯撒密码求解器

Caesar Cipher solver in Python

我在python中做了一个凯撒密码求解器,但是没有错误,只是没有打印任何东西。我也做过类似的事情,但是以前没有过。

with open("C:\Users\Rajive\AppData\Local\Programs\Python\Python3.4.3\brit-a-z.txt", 'r') as f:
    check_list = [x.strip() for x in f.readlines()]

def crackcaesar(encrypted):
    for i in range(26):
        totalwords = 0
        numright = 0
        answer = []
        if i != 0: 
            for symbol in encrypted:
                if symbol.isalpha():
                    neword = (ord(symbol) + i)
                    if symbol.isupper():
                            if neword > ord('Z'):
                                neword -= 26
                            elif neword < ord('A'):
                                neword += 26
                    elif symbol.islower():
                         if neword > ord('z'):
                             neword -= 26
                         elif neword < ord('a'):
                             neword += 26
                    newletter = chr(neword)
                    answer.append(newletter)
                    for word in str(answer):
                        totalwords += 1
                        for line in check_list:
                            if line == word:
                                numright += 1
        if (numright // 2) > (totalwords // 2):
            print(str(answer))

print("Type your encoded caesar cipher message")
while True:
    crackcaesar(input())

问题是 numright 永远不会大于 totalwords。尝试

if numright == totalwords:
    print(str(answer))

此外,answer是一个字符列表。 str(answer) 会给你 "['a', 'b', 'c']"。您需要使用 "".join(answer).

首先,你有一个 3 级嵌套循环,并没有真正实现密码。其次,您没有密码密钥(请参阅下面的编辑)。这个for循环:

for word in str(answer):
                        totalwords += 1
                        for line in check_list:
                            if line == word:
                                numright =+ 1

不应嵌套在这个已经嵌套的 for 循环中:

 for i in range(26):
        totalwords = 0
        numright = 0
        answer = []
        if i != 0: 
            for symbol in encrypted:

此外,i0-25 开始的循环中的 if i != 0: 似乎没有意义。您似乎在尝试匹配字母表范围,但是如果您将范围限制在 0-26 之间,那么实施 Caeser Cipher 就不会很幸运,因为第一个可打印字符从 32(space)开始,小写的 'z' 是 122。你应该一起删除那个循环 - 它会破坏密码。只需使用 for symbol in encrypted: 循环。

此外,循环 for word in str(answer): 正在逐个字符计算 answer 个字符 ,因此名为 totalwords 的变量实际上是在计算字符数,这您可以简单地通过获取字符串的长度来完成。如果你想做单词,你应该在 answer 变量上调用 str.split(' '),假设 space 字符是分隔符。希望这可以帮助。

编辑

你的钥匙在哪里? (确切地)。 你的密码的主要问题是当你需要添加(或减去)密钥数量时,你正在为每个序数值添加一个计数器变量。因为你没有实现密钥转换,您只需要添加一个值,否则您可以使用一组键来实现 caeser 密码。