@DmitryKyd
Студент специальности ИАСБ

Как построить алгоритм шифрования шифра двойным квадратом Уитстона?

Надо сделать шифрование двойным квадратом Уитстона.
Теорию можно почитать здесь.

Таблицы задаю сам, разбиение на биграммы уже есть.
Прошу помочь с построение алгоритма шифрования. Буду благодарен если опишите алгоритм, чтобы попробовал реализовать его сам. Или готовый алгоритм, но с пояснением. Хочется всё таки разобраться с этим.

Код:
import re

def PrintT1():
    print("Первая таблица:")
    for i in range(len(table1)):
        for j in range(len(table1[i])):
            print(table1[i][j], end=' ')
        print()

def PrintT2():
    print("Вторая таблица:")
    for i in range(len(table2)):
        for j in range(len(table2[i])):
            print(table2[i][j], end=' ')
        print()

def Bigramms(text1):
    bigramm = re.findall('..?',text1)
    print("Исходные биграммы:", bigramm)
    return bigramm

table1 = [["ы", "п", "у", "й", "я"], ["н", "а", "ь", "ц", "ф"], ["щ", "с", "л", "э", "б"], [" ", "в", "ч", "ж", "к"],
          ["у", "е", "м", ",", "ю"], ["р", "о", "ъ", "г", "."], ["д", "з", "ш", "т", "и"]]
table2 = [["а", "щ", " ", "т", "д"], ["к", "с", "г", "о", "е"], ["п", ".", "й", "ъ", "ш"], ["ф", "х", "р", "я", "л"],
          ["ы", "б", "ч", "ю", "н"], ["ж", "и", "у", "м", "ь"], ["в", "э", "ц", ",", "з"]]

PrintT1()
PrintT2()

print("Введите исходный текст:")
text1 = input().lower()

bigramm = Bigramms(text1)
  • Вопрос задан
  • 2053 просмотра
Решения вопроса 1
@vasilek-nik
Например так:

import random
class Key:
	"""
	Класс для генерации и обращение с ключем.
	Сам ключ представлен как две строки с перемешанным алфавитом
	"""
	ALPHABET_DEFAULT = "абвгдеёжзийклмнопрстуфхцчшщъыьэюя .!,-1234567890?"
	ROWS_DEFAULT = 7
	COLS_DEFAULT = 7
	def __init__(self,alphabet=ALPHABET_DEFAULT, rows=ROWS_DEFAULT, cols=COLS_DEFAULT):
		"""
		Принимает на вход символы алфавита и размер таблицы,
		либо использует алфавит по умолчанию
		"""
		self.rows = rows
		self.cols = cols
		self.table=[0]*2
		for i in range(2):
			self.table[i] = list(alphabet)
			random.shuffle(self.table[i])
			self.table[i] = ''.join(self.table[i])

	def __getitem__(self, key):
		"""
		Если передали кортеж из двух элементов, 
		то это поиск символа в левой (0) или правой (1) таблице
		Если передали кортеж из трех элементов,
		то это получение символа в таблице по координатам
		"""
		if len(key) == 2:
			#table and char
			i = self.table[key[0]].index(key[1])
			return i // self.cols, i % self.cols
		else:
			return self.table[key[0]][key[1]*self.cols+key[2]]

	def __str__(self):
		"""
		Для отображения ключа в читабельном виде
		"""
		s = ""
		for i in range(self.rows):
			s+=self.table[0][i*self.cols:(i+1)*self.cols]+"\t\t"+self.table[1][i*self.cols:(i+1)*self.cols]+"\n"
		return s
	
def bgrams(l):
	"""
	Генератор для разбиения строки на биграммы
	"""
	for i in range(0, len(l), 2):
		yield l[i:i + 2]

def crypt(s, key):
	"""
	Функция шифровки/дешифровки.
	Пробегаемся по всем биграммам и для каждой биграммы
	находим координаты первого символа в первой таблице,
	второго во второй таблице.
	Далее получаем символы из противоположных вершин прямоугольника
	и добавляем к строке с результатом
	"""
	assert len(s) % 2 == 0, "String must divedes by 2"
	r=""
	for bg in bgrams(s):
		(x1, y1), (x2, y2) = key[(0, bg[0])],key[(1, bg[1])]
		r+= key[(0, x2, y1)] + key[(1, x1, y2)]
	return r

#Проверка работоспособности
key = Key()
print(key)
s = crypt("привет человек. как у тебя дела?", key)
print(s)
s = crypt(s, key)
print(s)
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы