-
Notifications
You must be signed in to change notification settings - Fork 1
/
playfair.py
85 lines (76 loc) · 3.66 KB
/
playfair.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
from .table import Table
class Playfair(Table):
"""
Классовая реализация шифра Плейфера
:param key: Ключ закрытого алфавита
"""
def __init__(self, key: str) -> str:
key = self.replace(key)
if self.check_bad_lang(key):
raise ValueError("Должны использоваться исключительно русские символы!")
key = self.edit_key(key)
self.alph = self.make_alph(key)
def crypt(self, text: str) -> str:
"""
Функция шифрования текста
:param text: шифруемый текст
:returns: зашифрованный текст
"""
text = self.replace(text)
if self.check_bad_lang(text):
raise ValueError()
if len(text) % 2 == 1:
text += 'ь'
ctext = ""
length = len(ctext)
while length < len(text):
if text[length] == text[length+1]:
text = text[:length+1] + 'ьь' + text[length+1:]
ctext += self.crypt_b(text[length:length + 2])
length = len(ctext)
return ctext
def crypt_b(self, bigr: str) -> str:
"""
Функция шифрования биграмм
:param bigr: Шифруемая биграмма
:returns: Зашифрованная биграмма
"""
first_x, first_y = self.alph.index(bigr[0]) // 5, self.alph.index(bigr[0]) % 5
second_x, second_y = self.alph.index(bigr[1]) // 5, self.alph.index(bigr[1]) % 5
"""Массив для хранения строк и столбцов символов биграммы"""
if first_x == second_x:
# Проверяем, совпадают ли строки
# Если да, то прибавляем к столбцу единицу
first_y = (first_y + 1) % 5
second_y = (second_y + 1) % 5
elif first_y == second_y:
# Проверяем совпадают ли столбцы
# Если да, то прибавляем к строке единицу
first_x = (first_x + 1) % 6
second_x = (second_x + 1) % 6
else:
# Иначе взаимозаменяем номера столбцов
first_y, second_y = second_y, first_y
return self.alph[first_x * 5 + first_y] + self.alph[second_x * 5 + second_y]
def decrypt_b(self, bigr: str) -> str:
"""
Функция расшифрования биграмм
:param bigr: Расшифруемая биграмма
:returns: Расшифрованная биграмма
"""
first_x, first_y = self.alph.index(bigr[0]) // 5, self.alph.index(bigr[0]) % 5
second_x, second_y = self.alph.index(bigr[1]) // 5, self.alph.index(bigr[1]) % 5
if first_x == second_x:
# Проверяем, совпадают ли строки
# Если да, то отнимаем от столбца единицу
first_y = (first_y - 1) % 5
second_y = (second_y - 1) % 5
elif first_y == second_y:
# Проверяем совпадают ли столбцы
# Если да, то отнимаем от строки единицу
first_x = (first_x - 1) % 6
second_x = (second_x - 1) % 6
else:
# Иначе взаимозаменяем номера столбцов
first_y, second_y = second_y, first_y
return self.alph[first_x * 5 + first_y] + self.alph[second_x * 5 + second_y]