Skip to content

двойной квадрат Уитстона #2

@Rauan0606

Description

@Rauan0606

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):
О П Е Р А Ц И Б
В Г Д Ж З К Л М
Н С Т У Ф Х Ч Ш
Щ Ъ Ы Ь Э Ю Я _
Би�раммы для дешифрования (двойной квадрат): ['ОА', 'БД', 'ЗЛ', 'ОУ', 'ЦО', 'ПН', 'ФЫ']
Расшифрованное сообщение: АЕЕЛЛЖРУНМОСТЬ
здесь у меня должен выйти слово АПЕЛЛИРУЕМОСТЬ, у меня код не читает Буквы ОА ЗЛ ЦО должным образом. ОА должен заменятся на АП, ЗЛ на ЛИ, ЦО на ЕМ.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions