
Добавил:
KaFaka
t.me
Инфо для ГУАП студентов от меня: https://kafaka.notion.site/99e6d9b70ca74f7baef3daea17839e5a
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:ЛР1 / LR1_decrypt3
.pyfrom 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