Python 3.4: IndexError: индекс строки вне допустимого диапазона. Грубая сила

Я работаю над расшифровкой грубой силы для зашифрованных сообщений Caesar Cipher с использованием атаки по словарю, однако при сканировании слов в моем файле словаря он напечатает слово, но затем вернет ошибку «IndexError: String index out of range». Это также происходит при использовании более одного слова. Спасибо

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

person Jake Biggs    schedule 13.02.2017    source источник


Ответы (1)


Есть несколько вещей, которые неверны в вашем коде, но краткий ответ - эта строка:

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

Вы перебираете 26 различных значений alpha, и с каждой итерацией цикла while вы добавляете +1 к СМЕЩЕНИЮ, поэтому после 78 итераций ваше СМЕЩЕНИЕ имеет значение 78, и поэтому вы пытаетесь получить 25-78=-53 индекс alphabet.upper(), которого не существует. (помните об отрицательной обратной индексации в Python).

Это ответ на ваш вопрос, но помимо этого:

  • не используйте глобальные переменные, они действительно бесполезны в этом случае, чтобы избежать этого, вы можете, например, передать аргумент msg вашей функции в качестве аргумента и инициировать остальную часть внутри функции

  • ваш цикл while никогда не заканчивается, это одна из причин, по которой ваш код дает сбой, вы должны остановить его где-то, установив isSolved=True где-нибудь

  • однако, хотя цикл здесь избыточен, вы можете использовать for offset in range(26) для основного цикла, так как в любом случае вы не хотите, чтобы ваше смещение было больше, чем это

  • вы можете получить все буквенно-цифровые значения, такие как буквы из библиотеки str, встроенной в Python

  • вы также нигде не закрываете свой файл, это тоже ошибка, с которой можно справиться, закрыв файл вручную, или выполнив операции над ним в операторе with

  • вам не нужно перебирать punctuations, if letter in punctuations отлично с этим справляется

Я ничего не буду говорить о логике, это ваш способ думать об этой проблеме, спасибо за то, что вы поместили ее в код, но потом попытайтесь улучшить логику и получить большую часть ее из как можно меньшего количества кода.

Повеселись!

person marcinowski    schedule 13.02.2017
comment
Спасибо! Я изменил способ грубой силы, и наконец-то он заработал, очень признателен - person Jake Biggs; 16.02.2017
comment
Рад слышать! - person marcinowski; 16.02.2017