Добавил:
t.me Инфо для ГУАП студентов от меня: https://kafaka.notion.site/99e6d9b70ca74f7baef3daea17839e5a Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

ЛР1 / LR1_decrypt3

.py
Скачиваний:
3
Добавлен:
18.06.2024
Размер:
6.86 Кб
Скачать
from collections import Counter
import random

# Средняя статистика открытого текста на русском языке
avg_stats = {
    'О': 9.0, 'Е': 7.2, 'А': 6.2, 'И': 6.2, 'Н': 5.3,
    'Т': 5.3, 'С': 4.5, 'Р': 4.0, 'В': 3.8, 'Л': 3.5,
    'К': 2.8, 'М': 2.6, 'Д': 2.5, 'П': 2.3, 'У': 2.1,
    'Я': 1.8, 'Ы': 1.6, 'З': 1.6, 'Ь': 1.4, 'Ъ': 1.4,
    'Г': 1.3, 'Ч': 1.2, 'Й': 1.0, 'Х': 0.9, 'Ж': 0.7,
    'Ш': 0.6, 'Ю': 0.6, 'Ц': 0.4, 'Э': 0.3, 'Щ': 0.3, 'Ф': 0.2
}

# Зашифрованный текст
encrypted_text = "впфрпщзчрдстлкпвфзнюпэлпзозшбкпвнржпрерстлкпвфзнюпрерпзошвдсзтдэздуфтзфлнбзердрцтвпмцхтфзпвовлпзрпчржлнсрхнлшзлдржлнргзкюбпмхпвнлшззергэнлпвслувпэернржнагрдюмрфзщзуфдхлсрмртпруфюухжюгзрпивнргпрсзнвргзкюбпмвснбувнвбуивнлнубпвжплолжвнлофвнзтргнвержвтадвуумвквнопзпзозшстлиловбметхжлфвнзтгнвержвтажрорелнэпзквгхжхдвызерсржвбплбдрдфртрлтвкбдуфтзфлняфрерпзошвдрцтвпмцхтфзпвржзтзрпчржлнсрхнлшзлстржвдвнивтзпэзурулумвквдлжздозпбрпструнзклнубсржпбненвквмпзгхлумвквнргнвержвтадвуовлпезттбплмрежвпзквгхжхфрерфвнзтвмрфртэодэусвунлрфернржвозпблорасрмрлпхаргзкюбпхдвыфвнзтфрежвжвнпвомроцртфдфтзфллтвкбдуфтзфлнзердтрууллкжзуюрпстзсржвдвнтхуумложзфбожтздплзбкэмлфтлерпрозфтлалфзртлаохкэмлдудргржпрзрфхтрмрддтзобрплумвнузгзозуфржлтзмфртвизнзкпрлжртрелрбсропадвуумвквнрпопзсриловборатхмхдузтхуумлзнажлпзчртрылзнажлпрдэлумнащзплзбпзнагнатхуумлчпррдвулдвызофвнзтзгхжхсроплфюжрорелнэгрнюызоэуплопздуфтзщвнлую"

# Функция для нахождения ключа по средней статистике
def find_key(avg_stats, encrypted_counter):
    key_mapping = {}
    # Сортируем среднюю статистику по убыванию
    avg_stats_sorted = sorted(avg_stats, key=avg_stats.get, reverse=True)
    # Сортируем частоты в зашифрованном тексте по убыванию
    encrypted_sorted = sorted(encrypted_counter, key=encrypted_counter.get, reverse=True)
    # Определяем максимальное количество букв для сопоставления
    n = min(len(avg_stats_sorted), len(encrypted_sorted))
    # Сопоставляем каждой букве в зашифрованном тексте букву из средней статистики
    for i in range(n):
        key_mapping[encrypted_sorted[i]] = avg_stats_sorted[i]
    return key_mapping

# Считаем частоту каждой буквы в зашифрованном тексте
encrypted_counter = Counter(encrypted_text)

# Находим ключ по средней статистике
key_mapping = find_key(avg_stats, encrypted_counter)

# Замена символов в зашифрованном тексте с учетом найденного ключа
decrypted_text = "".join([key_mapping[char] if char in key_mapping else char for char in encrypted_text])

# # Вывод измененного текста
# print("Измененный зашифрованный текст:")
# print(decrypted_text)

# Проверка удовлетворенности пользователя
user_satisfaction = "нет"  # Начальное значение
correct_letters = ""  # Инициализация правильно расшифрованных букв
while user_satisfaction == "нет":
    # Замена символов в зашифрованном тексте с учетом текущего ключа
    decrypted_text = "".join([key_mapping[char] if char in key_mapping else char for char in encrypted_text])

    # Вывод измененного текста
    print("Измененный зашифрованный текст:")
    print(decrypted_text)

    # Запрос удовлетворенности пользователя
    user_satisfaction = input("Подходит ли вам расшифрованный текст? (да/нет): ").lower()
    if user_satisfaction == "нет":
        correct_letters = input("Введите буквы, которые были расшифрованы верно (без пробелов): ").upper()

        # Обновляем ключ, оставляя правильно расшифрованные буквы на своих местах
        for letter in correct_letters:
            if letter in key_mapping:
                del key_mapping[letter]

        # Составляем список оставшихся зашифрованных букв
        remaining_encrypted_letters = [char for char in encrypted_text if char not in correct_letters]

        # Определяем наиболее часто встречаемые буквы в зашифрованном тексте
        remaining_encrypted_counter = Counter(remaining_encrypted_letters)
        remaining_encrypted_sorted = sorted(remaining_encrypted_counter, key=remaining_encrypted_counter.get, reverse=True)

        # Определяем буквы, которые еще не вошли в ключ
        remaining_avg_stats = {k: v for k, v in avg_stats.items() if k not in key_mapping}
        remaining_avg_stats_sorted = sorted(remaining_avg_stats, key=remaining_avg_stats.get, reverse=True)

        # Ограничиваем количество букв, которые мы берем из remaining_avg_stats_sorted
        n = min(len(remaining_avg_stats_sorted), len(remaining_encrypted_sorted))

        # Заменяем оставшиеся буквы в ключе
        for i, letter in enumerate(remaining_avg_stats_sorted[:n]):
            key_mapping[remaining_encrypted_sorted[i]] = letter

        # Обновляем зашифрованный текст с учетом нового ключа
        decrypted_text = "".join([key_mapping[char] if char in key_mapping else char for char in encrypted_text])
Соседние файлы в папке ЛР1