Процесс шифрования заключается в следующем: исходное сообщение, записанное в переменную text, разбивается на блоки по 2 символа, на пример для исходного сообщения «У вас продается славянский шкаф»: «У_» «ва» «с_» и так далее. Для каждой пары символов (левая часть и правая часть блока) задается ключ, который определятся как i-ая буква из слова в переменной KEY, для этого символ переводится в кодовое значение Юникод функцией ord. Над каждым блоком выполняется шифрования по схеме изображенной на рисунке №, где F образующая функция шифрования xor 16 раз. Далее символы переводятся в десятичный код с помощью встроенной функции chr и объединяются в новый блок. Дешифрование проводится в обратном порядке. Li=Ri-1(Li K) Ri=Li-1 Li – левая часть блока Ri – правая часть. Описание кода работы программы Feistel_net на языке Python ROUNDS = 16 # Количество итераций для шифрования блоков KEY = 'Магдыш' # Ключ для шифрования text = 'У вас продается славянский шкаф' # Исходный текст block = [] # переменная для записи блоков исходного текста key_pos = 1 # ключ print("Исходный тескт: ", text) print("Кдюч: ", KEY) if len(text) % 2 != 0 : # Если длина исходного текста не четная, то добавляем знак пробела text = text +' ' #Разделяем текст на блоки по 2 символа, # каждый новый блок добавляем в переменную block for i in range(0, len(text), 2): block.append(text[i:i + 2]) #функция шифрования #входные переменные: #L-левый блок #R - правый блок #key_pos - ключ для новой пары блоков (буква из ключа для шифрования) def feistel(L,R,key_pos): for i in range(ROUNDS): K = ord(KEY[key_pos % 6::][0]) # назначение ключа (номер символа из переменной KEY) temp = R ^ (L ^ K) # выполнение первой части шифрования R xor (L xor K) R = L # правая часть исходного сообзения становиться левой частью L = temp # левая часть принимает значения зашифрованного сообщения (R xor (L xor K)) key_pos += 1 # назначение символа для следующей итерации шифрования end = (chr(R) + chr(L)) # объединение получившихся правого и левого блоков return end,key_pos #функция дешифрования def feistel_decrypt(L,R, key_pos): for i in range(ROUNDS): K = ord(KEY[key_pos % 6::][0]) temp = R ^ (L ^ K) R=L L = temp key_pos -= 1 end = (chr(L) + chr(R)) return end,key_pos #вывод на экран зашифрованного сообщения shifr = [] for x in block: block,key_pos = feistel(ord(x[0]), ord(x[1]), key_pos) shifr.append(block) # добавление нового блока к зашифрованному сообщению print('\nЗашифрованное сообщение:\n') print(''.join(shifr)) #объединение элементов списка переменной shifr в символльную строку #Вывод на экран дешифрованного сообощения defshifr=[] key_pos -= 1 for x in shifr[::-1]: # обращение к элементам массива shifr в обратном порядке block,key_pos = feistel_decrypt(ord(x[0]), ord(x[1]), key_pos) defshifr.append(block) #добавление нового блока к расшифровнанному сообщению defshifr_list=''.join(defshifr) #объединение элементов списка переменной deshifr в символльную строку defshifr_list_rev=list(defshifr_list[::-1]) #чтение defshifr_list в обратном порядке defshir_list_rev_str = ''.join(defshifr_list_rev) #объединение элементов списка переменной defshifr_list в символльную строку print('\nДешифрованное сообщение:\n') print(defshir_list_rev_str)