Маршрутная перестановка с ключом

Помогите, пожалуйста, как в данный код добавить, чтобы перестановка была не просто по маршруту, а с помощью ключа. Ключ задается по типу: "

    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) 

Ответы (0 шт):