0

我正在使用字典攻击对 Caesar Cipher 加密消息进行强力解密,但是在扫描字典文件中的单词时,它会打印该单词,但随后返回错误“IndexError:字符串索引超出范围”。当使用多个单词时也会发生这种情况。谢谢

import csv
global alphabet, space, punctuation, msg, OFFSET, isSolved
alphabet = ("abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz")
space = (" ")
punctuation = (".,!?':+-=£")
OFFSET = 0
isSolved = False
def crack():
    global alphabet, space, punctuation, msg, OFFSET, isSolved
    while not isSolved:
        toScan = str()
        for letter in list(msg):
            for punc in punctuation:
                if letter == punc:
                    toScan += punc
            if letter == space:
                toScan += space   
            for alpha in range(26):
                if letter.lower() in alphabet[alpha]:
                    toScan += str(alphabet.upper()[alpha-int(OFFSET)])
        dictionary = open("dict.csv", "r")
        reader = csv.reader(dictionary)
        for row in dictionary:
            if toScan.lower() in str(row.lower()):
                print(toScan.upper())
            else:
                OFFSET += 1

while True:
    print("[Xiphos Bruteforce.py]")
    print("1) Decrypt a message")
    print("2) Add word to the dictionary")
    print("3) Exit")
    r = input()
    if r == "1":
        msg = input("Please enter the message to crack\n")
        crack()
    if r == "2":
        None
    if r == "3":
        exit()
4

1 回答 1

1

您的代码有几处问题,但简短的回答是这一行:

toScan += str(alphabet.upper()[alpha-int(OFFSET)])

您循环了 26 个不同的值,alpha并且每次循环迭代while都将 +1 添加到 OFFSET,因此在 78 次迭代后,您的 OFFSET 的值为 78,因此您尝试获取不存在25-78=-53的索引(请记住负alphabet.upper()Python中的反向索引)。

这是您问题的答案,但除此之外:

  • 不要使用全局变量,在这种情况下它们真的没用,为了避免这种情况,你可以例如将一个参数msg作为参数传递给你的函数,并在函数内启动它的其余部分

  • 你的while循环永远不会结束,这是你的代码失败的原因之一,你应该在某处设置isSolved=True某处停止它

  • 然而,while 循环在这里是多余的,你可以使用for offset in range(26)主循环,因为无论如何你不希望你的偏移量大于那个

  • 您可以获取所有字母数字值,例如来自 Python 内置的 str 库中的字母

  • 你也没有在任何地方关闭你的文件,这也是一个错误,可以通过手动关闭文件来处理,或者在with语句中对其执行操作

  • 你不必迭代punctuationsif letter in punctuations完美地处理它

我不会说任何关于逻辑的事情,这是你思考这个问题的方式,为将其放入代码中而竖起大拇指,但之后尝试改进逻辑并从尽可能少的代码中获取大部分内容。

玩得开心!

于 2017-02-13T20:51:36.957 回答