Я - студент питона (сам по себе), и в качестве упражнения я решил попробовать написать скрипт для «шифрования / дешифрования» сообщения.«Алгоритм шифрования», который я использую, очень прост, я узнал во время военной службы, и он использовался для полевых войск для шифрования только радиосообщений.Я предполагаю, что это не безопасный способ зашифровать вещи.(Если кто-то может прокомментировать это, я хотел бы узнать больше) В любом случае, я делаю это как упражнение для программирования логики, но я застрял на некоторое время.
Вот как этоworks:
Вы получаете ключевое слово / фразу (чаще используется с 2 словами (вертикальное и горизонтальное), но сейчас я кодирую только 1 ключевое слово).Давайте используем «ПАРОЛЬ» в качестве ключа и сообщение: «Это пример сообщения».Я бы составил таблицу с ПАРОЛЕМ в качестве индекса столбца и заполнил таблицу сообщением:
P A S S W O R D
t h i s i s a s
a m p l e m e s
s a g e x y z x
[Поскольку сообщение не заполняло все столбцы, мы заполнили его буквами, которые не вызовут проблем]
Затем мы определяем порядок скремблирования, выводя его в алфавитном порядке по ключу:
4 1 6 7 8 3 5 2
P A S S W O R D
[a,d,o,p,r,s,s,w]
Таким образом, строка за строкой, буква за буквой, мы будем брать буквы из сообщения в соответствии спорядок ключей и сформируйте зашифрованное сообщение: «hsstaisi» для первой строки, «msmaeple» и «axyszgex» для второй и третьей строки.Таким образом, сообщение будет «hsstaisimsmaepleaxyszgex» [Обычно передается как «hssta isims maepl eaxys zgex», чтобы облегчить работу оператора радиосвязи]
Теперь код: Мне удается заставить его работать(вроде ...), вот как:
Я получаю сообщение и ключ, удаляю пробелы, превращаю их в списки.Я создаю словарь, в котором каждая буква из ключа (списка) становится ключом в dict, а значение представляет собой число (от 0 до длины ключа), как итератор.
{'p': 0, a ': 1,' s ': 2, ...} # [Вот моя проблема]
После этого мыотсортировать ключ (список) по алфавиту и использовать его в качестве итератора для вызова ключа (dict), который будет вызывать номер, который будет индексом из списка сообщений.(Мое объяснение сбивает с толку, может быть легче понять, проверяя код ниже).Буквенно за буквой сообщение шифруется и добавляется в новый список, а затем представляется как «зашифрованный».
Работает!За исключением случаев, когда ключевая фраза содержит повторяющиеся буквы (например, наш «пароль»).В этой ситуации соответствующее значение повторяющегося ключа словаря перезаписывается, потому что ключи dict являются уникальными.
Я написал несколько разных версий для одного и того же кода, но я всегда зацикливаюсь на проблеме dict, в тот или иной момент.
Вот фрагмент кода:
key = ['p','a','s','s','w','o','r','d']
msg = ['t','h','i','s','i','s','a','s','a','m','p','l','e','m','e','s','s','a','g','e']
def encrypt(key_list,msg_list):
while len(msg_list) % len(key_list) != 0:
rest = len(key_list) - (len(msg_list) % len(key_list))
for i in range(rest):
if msg_list[-1] == 'z':
msg_list.append('x')
else:
msg_list.append('z')
key_dict = {}
for i in range(len(key_list)):
key_dict[key_list[i]] = i
key_list.sort()
qnty_rows = len(msg_list) // len(key_list)
cloop = 0
scramble_list = []
while cloop < qnty_rows:
for i in range(len(key_list)):
scramble_list.append(msg_list[key_dict[key_list[i]]+(cloop*len(key_list))])
cloop +=1
encrypted_msg = "".join(scramble_list)
print(encrypted_msg)
Может кто-нибудь помочь мне найти решение или указать мне правильное направление?
Учитывая то, что я все еще учусь кодировать, любая конструктивная критика кода в целом приветствуется.