Вы можете значительно оптимизировать свой метод шифрования, если при вводе метода заполняете словарь в качестве поиска.Он содержит отображение, основанное на предоставленном 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