import string
def create_custom_alphabet(keyword, alphabet):
keyword = keyword.replace('Ё', '').replace('Й', '')
keyword_unique = ''.join(sorted(set(keyword), key=keyword.index))
remaining_letters = [char for char in alphabet if char not in keyword_unique and char not in ['Ё', 'Й']]
return keyword_unique + ''.join(remaining_letters)
def create_playfair_table(rows, cols, keyword, alphabet):
custom_alphabet = create_custom_alphabet(keyword, alphabet)
table = []
idx = 0
for i in range(rows):
row = []
for j in range(cols):
if idx < len(custom_alphabet):
row.append(custom_alphabet[idx])
idx += 1
table.append(row)
return table
def display_table(table):
for row in table:
print(" ".join(row))
def find_position_in_table(table, char):
for i, row in enumerate(table):
if char in row:
return i, row.index(char)
return None, None
def create_bigrams(message):
message = message.upper().replace('Ё', 'Е')
bigrams = []
i = 0
while i < len(message):
if i + 1 < len(message):
if message[i] == message[i + 1]:
bigrams.append(message[i] + '')
i += 1
else:
bigrams.append(message[i] + message[i + 1])
i += 2
else:
bigrams.append(message[i] + '')
i += 1
return bigrams
alphabet = "АБВГДЕЖЗИКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ_"
mode = input("Выберите режим (1 - Шифрование, 2 - Дешифрование): ")
if mode not in ['1', '2']:
print("Ошибка: неверный режим!")
exit()
if mode == '1':
keyword1 = input("Введите первое ключевое слово: ").upper()
keyword2 = input("Введите второе ключевое слово: ").upper()
message = input("Введите сообщение для шифрования/дешифрования: ").upper()
def double_square_encrypt(plaintext, table1, table2):
ciphertext = ''
bigrams = create_bigrams(plaintext)
print(f"Биграммы для шифрования (двойной квадрат): {bigrams}")
for bigram in bigrams:
row1, col1 = find_position_in_table(table1, bigram[0])
row2, col2 = find_position_in_table(table2, bigram[1])
if row1 == row2:
ciphertext += table2[row1][col1]
ciphertext += table1[row2][col2]
else:
ciphertext += table1[row1][col2]
ciphertext += table2[row2][col1]
return ciphertext
print("Матрица Плейфера (Таблица 1):")
rows, cols = 4, 8
table1 = create_playfair_table(rows, cols, keyword1, alphabet)
display_table(table1)
print("Матрица Плейфера (Таблица 2):")
rows, cols = 4, 8
table2 = create_playfair_table(rows, cols, keyword2, alphabet)
display_table(table2)
encrypted_message = double_square_encrypt(message, table1, table2)
print(f"Зашифрованное сообщение: {encrypted_message}")
elif mode == '2':
keyword1 = input("Введите первое ключевое слово: ").upper()
keyword2 = input("Введите второе ключевое слово: ").upper()
message = input("Введите сообщение для шифрования/дешифрования: ").upper()
def double_square_decrypt(ciphertext, table2, table1):
plaintext = ''
bigrams = create_bigrams(ciphertext)
print(f"Биграммы для дешифрования (двойной квадрат): {bigrams}")
for bigram in bigrams:
row1, col1 = find_position_in_table(table1, bigram[0])
row2, col2 = find_position_in_table(table2, bigram[1])
if row1 is None or row2 is None:
print(f"Ошибка: символ '{bigram[0]}' или '{bigram[1]}' не найден в таблице.")
continue
if row1 == row2:
plaintext += table1[row1][col2]
plaintext += table2[row2][col1]
elif col1 == col2:
plaintext += table2[row1][col1]
plaintext += table1[row2][col2]
else:
plaintext += table2[row1][col2]
plaintext += table1[row2][col1]
return plaintext
print("Матрица Плейфера (Таблица 1):")
rows, cols = 4, 8
table1 = create_playfair_table(rows, cols, keyword2, alphabet)
display_table(table1)
print("Матрица Плейфера (Таблица 2):")
rows, cols = 4, 8
table2 = create_playfair_table(rows, cols, keyword1, alphabet)
display_table(table2)
decrypted_message = double_square_decrypt(message, table2, table1)
print(f"Расшифрованное сообщение: {decrypted_message}")
помогите в коде дешифрования, у меня не получается реализовать код который если 2 буквы находится в одном строке то они должны заменятся соответствующему индексу из другой таблицы
Вот ответ который выходит:
Выберите режим (1 - Шифрование, 2 - Дешифрование): 2
Введите первое ключевое слово: операции
Введите второе ключевое слово: программа
Введите сообщение для шифрования/дешифрования: ОАБДЗЛОУЦОПНФЫ
Матрица Плейфера (Таблица 1):
П Р О Г А М Б В
Д Е Ж З И К Л Н
С Т У Ф Х Ц Ч Ш
Щ Ъ Ы Ь Э Ю Я _
Матрица Плейфера (Таблица 2):
О П Е Р А Ц И Б
В Г Д Ж З К Л М
Н С Т У Ф Х Ч Ш
Щ Ъ Ы Ь Э Ю Я _
Би�раммы для дешифрования (двойной квадрат): ['ОА', 'БД', 'ЗЛ', 'ОУ', 'ЦО', 'ПН', 'ФЫ']
Расшифрованное сообщение: АЕЕЛЛЖРУНМОСТЬ
здесь у меня должен выйти слово АПЕЛЛИРУЕМОСТЬ, у меня код не читает Буквы ОА ЗЛ ЦО должным образом. ОА должен заменятся на АП, ЗЛ на ЛИ, ЦО на ЕМ.
import string
def create_custom_alphabet(keyword, alphabet):
keyword = keyword.replace('Ё', '').replace('Й', '')
keyword_unique = ''.join(sorted(set(keyword), key=keyword.index))
remaining_letters = [char for char in alphabet if char not in keyword_unique and char not in ['Ё', 'Й']]
return keyword_unique + ''.join(remaining_letters)
def create_playfair_table(rows, cols, keyword, alphabet):
custom_alphabet = create_custom_alphabet(keyword, alphabet)
table = []
idx = 0
for i in range(rows):
row = []
for j in range(cols):
if idx < len(custom_alphabet):
row.append(custom_alphabet[idx])
idx += 1
table.append(row)
return table
def display_table(table):
for row in table:
print(" ".join(row))
def find_position_in_table(table, char):
for i, row in enumerate(table):
if char in row:
return i, row.index(char)
return None, None
def create_bigrams(message):
message = message.upper().replace('Ё', 'Е')
bigrams = []
i = 0
while i < len(message):
if i + 1 < len(message):
if message[i] == message[i + 1]:
bigrams.append(message[i] + '')
i += 1
else:
bigrams.append(message[i] + message[i + 1])
i += 2
else:
bigrams.append(message[i] + '')
i += 1
return bigrams
alphabet = "АБВГДЕЖЗИКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ_"
mode = input("Выберите режим (1 - Шифрование, 2 - Дешифрование): ")
if mode not in ['1', '2']:
print("Ошибка: неверный режим!")
exit()
if mode == '1':
keyword1 = input("Введите первое ключевое слово: ").upper()
keyword2 = input("Введите второе ключевое слово: ").upper()
message = input("Введите сообщение для шифрования/дешифрования: ").upper()
elif mode == '2':
keyword1 = input("Введите первое ключевое слово: ").upper()
keyword2 = input("Введите второе ключевое слово: ").upper()
message = input("Введите сообщение для шифрования/дешифрования: ").upper()
помогите в коде дешифрования, у меня не получается реализовать код который если 2 буквы находится в одном строке то они должны заменятся соответствующему индексу из другой таблицы
Вот ответ который выходит:
Выберите режим (1 - Шифрование, 2 - Дешифрование): 2
Введите первое ключевое слово: операции
Введите второе ключевое слово: программа
Введите сообщение для шифрования/дешифрования: ОАБДЗЛОУЦОПНФЫ
Матрица Плейфера (Таблица 1):
П Р О Г А М Б В
Д Е Ж З И К Л Н
С Т У Ф Х Ц Ч Ш
Щ Ъ Ы Ь Э Ю Я _
Матрица Плейфера (Таблица 2):
О П Е Р А Ц И Б
В Г Д Ж З К Л М
Н С Т У Ф Х Ч Ш
Щ Ъ Ы Ь Э Ю Я _
Би�раммы для дешифрования (двойной квадрат): ['ОА', 'БД', 'ЗЛ', 'ОУ', 'ЦО', 'ПН', 'ФЫ']
Расшифрованное сообщение: АЕЕЛЛЖРУНМОСТЬ
здесь у меня должен выйти слово АПЕЛЛИРУЕМОСТЬ, у меня код не читает Буквы ОА ЗЛ ЦО должным образом. ОА должен заменятся на АП, ЗЛ на ЛИ, ЦО на ЕМ.