Цезарь Только шифр Код шифрует одну букву, а не всю строку - PullRequest
0 голосов
/ 06 октября 2018

Итак, я нахожусь в процессе создания простого шифра Цезаря для практики, и я не могу заставить его расшифровывать целые строки, только отдельные буквы.

symbol_add - это рассматриваемая функция.

Вот код:

import re

alphabet = "abcdefghijklmnopqrstuvwxyz"

def cleanIt(clean):
    global alphabet
    s = re.sub('[^a-z]+', '?', str(clean))
    return s

def symbol_add(symbol, key):
    encryptedMsg = ""
    for x in symbol:
        position = alphabet.find(x)
        newPosition = (position + key) % 26
        newLetter = alphabet[nyPosisjon]

    encryptedMsg += nyBokstav
    return encryptedMsg

def cipher(data,key):
    text = ""
    if data in alphabet:
        text += symbol_add(symbol=data,key=key)
        return text

def main():
    try:
        msg = (input("Write the message you would like to encrypt\n"))
        key = int(input("which key would you like to use?\n"))
        cleanIt(clean=msg)
        print(cipher(data=msg, key=key))
    except ValueError:
        print("Write a number!")

main()

Я уверен, что решение довольно простое, все еще учится.

Любая помощь в том, как решить эту проблему, будет принята с благодарностью!

Ответы [ 2 ]

0 голосов
/ 06 октября 2018

Вы можете значительно оптимизировать свой метод шифрования, если при вводе метода заполняете словарь в качестве поиска.Он содержит отображение, основанное на предоставленном key, и отображает ваши входные символы на символ шифра.

Гораздо быстрее искать в диктовке, чем .index() в строку.

Использование dict.get(key[,default]) позволяет предоставить '?' для неизвестных, поэтому вам не нужно import re и никакой предварительной обработки.

Читайте о dict.get(): Почему dict.get (ключ) вместо dict [ключ]?

Добавление сопоставления заглавных букв в chiffre также тривиально, так какстрочные:

alphabet = "abcdefghijklmnopqrstuvwxyz"

def cipher(data, key):
    # in case you change alphabet
    la = len(alphabet)

    # get the default lookup 
    chiffre = { c:alphabet[(i+key)%la] for i,c in enumerate(alphabet) }

    # create lookup for upper cases as well
    chiffre.update( { c.upper():n.upper() for c,n in chiffre.items() } )

    # supply ? for all unknowns, use the knowns where possible and return as string
    return ''.join( (chiffre.get(c,"?") for c in data) )

def main():
    try:
        msg = (input("Write the message you would like to encrypt\n"))
        key = int(input("which key would you like to use?\n"))

        print(cipher(data=msg, key=key))
    except ValueError:
        print("Write a number!")

main()

Вывод:

Write the message you would like to encrypt
Hello World
which key would you like to use?
1
Ifmmp?Xpsme
0 голосов
/ 06 октября 2018
import re

alphabet = "abcdefghijklmnopqrstuvwxyz"

def cleanIt(clean):
    global alphabet
    s = re.sub('[^a-z]+', '?', str(clean))
    return s

def symbol_add(symbol, key):
    position = alphabet.find(symbol)
    newPosition = (position + key) % 26
    newLetter = alphabet[newPosition]
    return newLetter

def cipher(data,key):
    text = ""
    for letter in data:
        if letter in alphabet:
            text += symbol_add(symbol=letter,key=key)
    return text

def main():
    try:
        msg = (input("Write the message you would like to encrypt\n"))
        key = int(input("which key would you like to use?\n"))
        # Note: you need to assign msg to be equal to cleanIt(clean=msg). 
        #       Just calling cleanIt(clean=msg) won't work, as strings 
        #       are immutable in Python
        msg = cleanIt(clean=msg)
        print(cipher(data=msg, key=key))
    except ValueError:
        print("Write a number!")

main()

Основные изменения:

  • for loop был перемещен с symbol_add на cipher, так что symbol_add вызывается для каждого символа
  • В main(): cleanIt(clean=msg) -> msg = cleanIt(clean=msg);Причина этого заключается в том, что строки являются неизменяемыми в Python, а это означает, что вам нужно переназначить переменную msg, чтобы по существу указать на новую строку.

Вывод этого кода:

Write the message you would like to encrypt
test
which key would you like to use?
1
uftu

Также попробуйте придерживаться единого соглашения об именах;у вас есть функция, которая следует за camelCase (cleanIt), а другая функция, которая следует за snake_case (symbol_add).Попробуйте назвать все функции одинаково.(В Python принято использовать snake_case для функций)

...