При расшифровке шифра Цезаря с помощью грубой силы не удается распечатать правильные попытки

Я пытаюсь расшифровать шифр Цезаря с помощью грубой силы. Я могу довольно легко что-то зашифровать, а затем я хочу, чтобы программа расшифровывала сообщение с помощью грубой силы. Я хочу, чтобы python распечатал все 26 значений сдвига зашифрованного сообщения. Это мой код:

message = input("What message do you want to use: ")
shiftValue = int(input("What would you like to shift the message by: "))
encryptedMsg = ""

for character in message: 
    if character.isalpha() == True: 
        if character == character.lower():
            x = ord(character) - 97 
            x += shiftValue 
            x = x % 26  
            encryptedMsg += chr(x + 97) 
        else:
            x = ord(character) - 65
            x += shiftValue
            x = x % 26
            encryptedMsg += chr(x+65)
    else: 
        encryptedMsg += character

print(encryptedMsg)

def decrypt(encryptedMsg):
    i = 0
    shiftValue = 0
    while i < 26:                  
        attempt = ""
        for char in encryptedMsg:
            if char.isalpha() == True:
                x = ord(char) - 97
                x = x + shiftValue
                x = x % 26
                attempt += chr(x+97)
            else:
                attempt += char
            print(attempt)
            i += 1
            shiftValue += 1

decrypt(encryptedMsg)

Как только я запустил это, мне дается следующий код в оболочке python. Допустим, переменная сообщения - «Меня зовут Даниэль», и я использую shiftValue, равный 2. Вот что печатается:

i
ib
ib 
ib s
ib sg
ib sgt
ib sgtm
ib sgtm 
ib sgtm s
ib sgtm sd
ib sgtm sd 
ib sgtm sd k
ib sgtm sd ko
ib sgtm sd koc
ib sgtm sd kocy
ib sgtm sd kocyv
ib sgtm sd kocyvd
z
zs
zs 
zs j
zs jx
zs jxk
zs jxkd
zs jxkd 
zs jxkd j
zs jxkd ju
zs jxkd ju 
zs jxkd ju b
zs jxkd ju bf
zs jxkd ju bft
zs jxkd ju bftp
zs jxkd ju bftpm
zs jxkd ju bftpmu

person D. Smith    schedule 01.06.2017    source источник


Ответы (1)


Последние 3 строки decrypt() выполняются на каждой итерации for char in encryptedMsg. Это не правильно. Вы хотите завершить создание расшифрованной строки перед ее печатью.

Другая проблема заключается в том, что ваша программа неправильно обрабатывает символы верхнего регистра. Быстрое решение - использовать lower() для преобразования всего в нижний регистр перед обработкой.

Попробуй это:

def decrypt(encryptedMsg):
    i = 0
    shiftValue = 0
    while i < 26:                  
        attempt = ""
        for char in encryptedMsg.lower():
            if char.isalpha() == True:
                x = ord(char) - 97
                x = x + shiftValue
                x = x % 26
                attempt += chr(x+97)
            else:
                attempt += char
        i += 1
        shiftValue += 1
        print(attempt)

Редактировать:

Более питонический способ реализации циклов - использовать синтаксис типа for x in range(y):. Кроме того, if x == True всегда можно упростить до if x:. Вот упрощенная версия вашего кода с одной переменной итератора (shiftValue):

def decrypt(encryptedMsg):
    for shiftValue in range(26):
        attempt = ""
        for char in encryptedMsg.lower():
            if char.isalpha():
                x = (ord(char) - 97 + shiftValue) % 26
                attempt += chr(x+97)
            else:
                attempt += char
        print(attempt)
person r3mainer    schedule 01.06.2017
comment
Спасибо. Я отредактировал свой код так, что теперь он будет шифровать прописные и строчные буквы, но когда я его запускаю, Python просто распечатывает пустые операторы при распечатке 26 решений. Ты знаешь почему? см. отредактированный первый пост - person D. Smith; 01.06.2017
comment
Нет. Но после if char.isalpha(): попробуйте добавить что-нибудь вроде if char.isupper(): base = ord('A') else: base = ord('a'), а затем замените 97 на base в следующих строках. - person r3mainer; 01.06.2017
comment
Спасибо! Разобрал проблему! - person D. Smith; 01.06.2017