В предыдущей статье я рассказывал, что представляет из себя шифр квадрат Полибия. Сейчас покажу усложненную версию.
Шифрование будет состоять из следующих этапов:
- Преобразование букв в пары чисел
- Разделяем пары чисел на два списка: числа по горизонтали и числа по вертикали
- Соединяем числа в один список друг за другом
- Соединяем числа по парно
- Преобразуем пары чисел в буквы согласно квадрату Полибия
Преступим к написанию кода. Имеем входные данные строку и квадрат Полибия представленный словарем.
text='helloworld'
keys={
'a':'11', 'b':'12', 'c':'13', 'd':'14', 'e':'15', 'f':'16',
'g':'21', 'h':'22', 'i':'23', 'j':'24', 'k':'25', 'l':'26',
'm':'31', 'n':'32', 'o':'33', 'p':'34', 'q':'35', 'r':'36',
's':'41', 't':'42', 'u':'43', 'v':'44', 'w':'45', 'x':'46',
'y':'51', 'z':'52', '0':'53', '1':'54', '2':'55', '3':'56',
'4':'61', '5':'62', '6':'63', '7':'64', '8':'65', '9':'66'
}
В начале преобразуем числа в пары чисел согласно квадрату Полибия.
crypt='' - создаем пустую строку
for i in text: - перебираем буквы в тексте
for j in keys: - перебираем ключи словаря
if i==j: - если ключ равен букве из текста
crypt+=keys[j]+' '- то добаваляем число в строку и добавляем пробел
crypt=[str(i) for i in crypt.split()] преобразуем строку в список
Получаем список ['22', '15', '26', '26', '33', '45', '33', '36', '26', '14']. Дальше делим список на два. Первый список это числа по вертикали, а второй список это числа по горизонтали.
crypt1=[ ] - пустой список для заполнения числами по вертикали
crypt2=[ ]- пустой список для заполнения числами по горизонтали
for j in range(len(crypt)):
crypt1+=str(crypt[j][0])
crypt2+=str(crypt[j][1])
Получаем два списка ['2', '1', '2', '2', '3', '4', '3', '3', '2', '1'] и ['2', '5', '6', '6', '3', '5', '3', '6', '6', '4']. Теперь соединим два списка друг за другом.
crypt3=crypt1+crypt2
Получаем список ['2', '1', '2', '2', '3', '4', '3', '3', '2', '1', '2', '5', '6', '6', '3', '5', '3', '6', '6', '4']. Теперь преобразуем числа в пары чисел, соединенные по порядку
crypt=[ ]-чистим список
for j in range(0,len(crypt3),2):- соединяем числа по парно
crypt+=[crypt3[j]+crypt3[j+1]]
Получаем список ['21', '22', '34', '33', '21', '25', '66', '35', '36', '64']. Теперь осталось преобразовать числа в буквы, согласно квадрату Полибия.
crypt3='' - создаем пустую строку
for i in crypt: - перебираем пары чисел
for j in keys: - перебираем словарь
if keys[j]==i: - если ключ равен элементу списка
crypt3+=j - то добавляем букву в строку
В итоге получаем вот зашифрованную строку ghpogk9qr7.
Теперь покажу расшифровку, все действия выполняются в обратном порядке. Преобразуем буквы в пары чисел.
decrypt=''
for i in crypt3: - перебираем буквы
for j in keys: - перебираем ключи словаря
if i==j: - если буква равна ключу из словаря
decrypt+=keys[j]+' ' - тогда добавляем в строку число и добавляем пробел
decrypt=[str(i) for i in decrypt.split()] - преобразуем строку в список
Получаем список ['21', '22', '34', '33', '21', '25', '66', '35', '36', '64']. Далее делим пары чисел на отдельные числа.
decrypt3=[ ] - создаем список
for i in range(len(decrypt)): - перебираем список decrypt
decrypt3+=[decrypt[i][0]]+[decrypt[i][1]] - записываем каждое число в отдельную ячейку списка
Получаем список ['2', '1', '2', '2', '3', '4', '3', '3', '2', '1', '2', '5', '6', '6', '3', '5', '3', '6', '6', '4']. Дальше необходимо разделить список на два как это было при зашифровании.
z=int(len(decrypt3)/2) - находим длину половины списка
decrypt1=decrypt3[0:z] - числа по вертикали
decrypt2=decrypt3[z:] - числа по горизонтали
Получаем два списка ['2', '1', '2', '2', '3', '4', '3', '3', '2', '1'] и ['2', '5', '6', '6', '3', '5', '3', '6', '6', '4']. Дальше необходимо преобразовать два списка в один соединяя цифры попарно.
for i in range(z): - перебираем числа из списков decrypt1 и decrypt2
decrypt+=[decrypt1[i]+decrypt2[i]] - складываем по парно первое число из
списка decrypt1 + первое число из списка decrypt2 и т.д.
Получаем список ['22', '15', '26', '26', '33', '45', '33', '36', '26', '14']. Осталось преобразовать пары чисел в буквы.
decrypt3='' - создаем строку
for i in decrypt: - перебираем пары чисел
for j in keys: - перебираем ключи
if keys[j]==i: - если ключ словаря равен числу
decrypt3+=j - то добавляем ключ(букву) в строку
В итоге, получаем наше расшифрованное сообщение helloworld.