Python中的Caesar密码解算器

2024-07-08 07:13:18 发布

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

我用python做了一个caesar密码解算器,但是没有错误,只是没有打印任何东西。我也做过类似的事情,但这以前从来没有发生过。在

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())

Tags: answerinforifchecksymbollistencrypted
2条回答

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

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

另外,answer是一个字符列表。str(answer)会给你{}。您需要使用"".join(answer)。在

首先,您有一个3级嵌套循环,而不是实际实现密码。其次,您没有密码密钥(请参见下面的编辑)。此for循环:

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

不应嵌套在此已嵌套的for循环中:

^{pr2}$

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

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

编辑

你的钥匙在哪里?(完全正确)。您的密码的主要问题是,当您需要添加(或减去)密钥量时,您将在每个序数值上添加一个计数器变量。由于您没有实现密钥移位,因此只需要添加一个值,否则您可以使用密钥数组来实现caeser密码。在

相关问题 更多 >

    热门问题