Не уверен, как вы получили «HWOLG MQ MSQ», когда в качестве обычного текста «HELLO MY MAN» и клавиша «asd». Я получаю что-то еще.
В любом случае, может быть что-то вроде этого:
def encrypt(plaintext, key):
from itertools import cycle
from string import ascii_uppercase as alphabet
offset = ord("A")
key_char = cycle(key)
encrypted_plaintext = ""
for char in plaintext:
# If the current character is any kind of whitespace...
if char.isspace():
# Append it to the final string with no changes.
encrypted_plaintext += char
else:
# The character is not whitespace, so you have to encrypt it.
char_sum = ord(char) + ord(next(key_char))
char_sum_wrapped = char_sum % len(alphabet)
encrypted_plaintext += chr(char_sum_wrapped + offset)
return encrypted_plaintext
Если текущий символ является пробелом, просто добавьте его в последнюю строку без каких-либо изменений. str.isspace
возвращает истину, если каждый символ в строке (текущий символ) является своего рода пробелом (пробел, табуляция, перевод строки, возврат каретки и т. Д.).
Я стараюсь избегать работы с индексами и жестко закодированными числами всякий раз, когдаЯ могу, поэтому я изменил некоторые вещи. Например, вместо того, чтобы превращать все символы в открытом тексте и ключе в целые числа, прежде чем делать что-либо еще, как вы, я просто конвертирую символы в цикле. Между прочим, цикл также отличается - я перебираю символы в открытом тексте, в отличие от выполнения цикла for на основе диапазона, а затем трактую i
как индекс для текущего символа. Все остальное в основном одинаково (за исключением вещей key_char
и itertools.cycle
, прочитайте мои заметки ниже).
Еще одна вещь, которую стоит отметить, - в этой реализации итератор key_char
будеттолько продвигаться, если текущий символ в открытом тексте не является пробелом - однако, вы можете захотеть, чтобы он продвигался независимо. Просто кое-что, что нужно иметь в виду.
Не имеет значения, кажется, это желаемое поведение для этого шифра.
Кроме того, просто примечание, ваша программа начинается с этих нескольких строк:
#creating variables to be used
text_in_use = ''
encrypt_key = ''
decrypt_key = ''
Они вообще не вносят вклад, вы можете безопасно удалить их.
РЕДАКТИРОВАТЬ - Еще немного информации:
itertools.cycle
- это функция, которая, учитываяИтерируемый (как строка или список), возвращает итератор, который возвращает элементы в этой итерируемой. Например:
>>> from itertools import cycle
>>> char_iterator = cycle("ABC")
>>> next(char_iterator)
'A'
>>> next(char_iterator)
'B'
>>> next(char_iterator)
'C'
>>> next(char_iterator)
'A'
>>> next(char_iterator)
'B'
>>> next(char_iterator)
'C'
>>> next(char_iterator)
'A'
>>>
Как видите, цикл повторяется бесконечно. По этой причине я решил использовать itertools.cycle
для замены keyAsIntegers[i % keyLength]
в исходном коде.
string.ascii_uppercase
- это просто строка, состоящая из всех заглавных букв между AZ. В моем коде я импортирую ascii_uppercase
и в той же строке переименую его в alphabet
, но они совпадают.
>>> from string import ascii_uppercase as alphabet
>>> alphabet
'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
>>>