Маршрутная перестановка с ключом
Помогите, пожалуйста, как в данный код добавить, чтобы перестановка была не просто по маршруту, а с помощью ключа. Ключ задается по типу: "
key_len = 7
print ('Длина ключа = ', key_len)
key_encr = {0:6, 1:4, 2:5, 3:1, 4:2, 5:3,6:0}
print ('Ключ шифрования', key_encr)
key_decr = {i:0 for i in range (key_len)} # Пустой словарь
for i in range (key_len):
key_decr[key_encr[i]] = i # Переворачиваем (то что было значением словаря шифрования
# становится ключом словаря дешифрования)
print ('Ключ дешифрования', key_decr)
# ПРОВЕРЯЕМ КРАТНОСТЬ ДЛИНЫ СООБЩЕНИЯ ДЛИНЕ КЛЮЧА
# --------------------------------------------------------
num_tail = X_mod_N (message_len, key_len)
if num_tail != 0 :
num_add_char = key_len - message_len % key_len
print ('Надо добавить', num_add_char)
for i in range (num_add_char):
message_list.append('!')
message_len = len(message_list)
block_nums = message_len // key_len
print ('Длина сообщения', message_len, 'Количество блоков', block_nums)
for i in range (block_nums):
print('Блок', i, message_list[i*key_len : i*key_len+key_len])
" Сам код без ключа:
import math
import sympy as sp
import numpy as np
def X_mod_N(X, N):
return X - (X // N) * N
message_text = 'ПРИВЕТ_ВСЕМ'
message_list = list(message_text)
print ('Текст сообщения', message_text)
message_len = len(message_text)
print ('Длина сообщения', message_len)
print ('Длина сообщения', len(message_list), 'Текст сообщения', message_list)
# ПРОВЕРЯЕМ КРАТНОСТЬ ДЛИНЫ СООБЩЕНИЯ длине блока
num_rows = 3
num_clms = key_len
block_len = num_rows * num_clms
print ('Число строк', num_rows,'Число столбцов', num_clms, 'Длина блока', block_len)
block_tail = X_mod_N(message_len, block_len)
num_add_char = block_len - block_tail
print ('Хвост', block_tail,'Добавляем', num_add_char)
if num_add_char != 0 :
for i in range (num_add_char):
message_list.append('!')
message_len = len(message_list)
block_nums = message_len // block_len
print ('Длина сообщения', message_len,'Длина блока', block_len,'Число блоков', block_nums)
print ('Длина сообщения', len(message_list), 'Текст сообщения', message_list)
# ШИФРОВАНИЕ
#ФОРМИРОВАНИЕ ПОСЛЕДОВАТЕЛЬНОСТИ МАТРИЦ
encript_text_list = []
for s in range (block_nums):
char_matr = [['']* num_clms for i in range (num_rows)]
for i in range (num_rows):
for j in range (num_clms):
char_matr[i][j] = message_list[s*block_len + num_clms*i+j]
print (char_matr)
for j in range (num_clms):
for i in range (num_rows):
encript_text_list.append (char_matr[i][j])
print('Шифрованное сообщение', encript_text_list)
encript_text_string = ''.join(encript_text_list)
print('Шифрованное сообщение', encript_text_string)
# ДЕШИФРОВАНИЕ
message_len = len(encript_text_string)
list_for_decrippt = list(encript_text_string)
print (list_for_decrippt)
decript_text_list = []
for s in range (block_nums):
char_matr_ = [['']* num_rows for i in range (num_clms)]
for i in range (num_clms):
for j in range (num_rows):
char_matr_[i][j] = list_for_decrippt [s*block_len + num_rows*i+j]
print (char_matr_)
for j in range (num_rows):
for i in range (num_clms):
decript_text_list.append (char_matr_[i][j])
print('Расшифрованное сообщение', decript_text_list)
decript_text_string = ''.join(decript_text_list)
print('Расшифрованное сообщение', decript_text_string)