Uploaded by Александр Шульженко

сеть фейстеля1

advertisement
Процесс шифрования заключается в следующем: исходное сообщение,
записанное в переменную 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)
Download