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

ЛР1 / LR1_decrypt

.py
Скачиваний:
3
Добавлен:
18.06.2024
Размер:
5.29 Кб
Скачать
def analyze_encrypted_text(encrypted_text, russian_letter_frequency):
# Словарь для хранения количества встреч букв в зашифрованном тексте
encrypted_letter_count = {letter: 0 for letter in russian_letter_frequency}

# Подсчитываем количество встреч букв в зашифрованном тексте
for char in encrypted_text:
if char.upper() in russian_letter_frequency:
encrypted_letter_count[char.upper()] += 1

# Выводим таблицу с результатами анализа
print("Буква\t\tСтатистика\tПерехвачено\tСреднее")
print("-" * 45)
for letter, frequency in russian_letter_frequency.items():
count = encrypted_letter_count[letter]
average = frequency
print(f"{letter}\t\t{frequency}\t\t{count}\t\t{average}")

return encrypted_letter_count

# Осредненная статистика повторяемости букв в русском языке
russian_letter_frequency = {
'А': 62, 'Б': 14, 'В': 38, 'Г': 13, 'Д': 25, 'Е': 72, 'Ё': 72, 'Ж': 7, '3': 16, 'И': 62, 'Й': 10,
'К': 28, 'Л': 35, 'М': 26, 'Н': 53, 'О': 90, 'П': 23, 'Р': 40, 'С': 45, 'Т': 53, 'У': 21, 'Ф': 2,
'Х': 9, 'Ц': 4, 'Ч': 4, 'Ш': 6, 'Щ': 3, 'Ы': 16, 'Ь': 14, 'Ъ': 14, 'Э': 3, 'Ю': 16, 'Я': 18
}

def crack_encrypted_text(encrypted_text, encrypted_letter_count, russian_letter_frequency):
# Словарь для хранения замен букв в шифрограмме
replacements = {}

# Перебираем буквы по убыванию частоты встречаемости
for letter in sorted(encrypted_letter_count, key=encrypted_letter_count.get, reverse=True):
if letter.upper() in russian_letter_frequency:
# Ищем наиболее вероятную замену буквы в зашифрованном тексте
encrypted_frequency = encrypted_letter_count[letter]
average_frequency = russian_letter_frequency[letter.upper()]
# Вычисляем разницу между статистиками
diff = encrypted_frequency - average_frequency

# Находим букву из статистики с наиболее близкой частотой
closest_letter = min(russian_letter_frequency, key=lambda x: abs(russian_letter_frequency[x] - diff))

# Делаем замену буквы в зашифрованном тексте
replacements[letter] = closest_letter

# Заменяем все встречающиеся буквы в тексте
encrypted_text = encrypted_text.replace(letter, closest_letter)

return encrypted_text, replacements

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

# Анализируем зашифрованный текст
encrypted_letter_count = analyze_encrypted_text(encrypted_text, russian_letter_frequency)

# Взламываем зашифрованный текст
cracked_text, replacements = crack_encrypted_text(encrypted_text, encrypted_letter_count, russian_letter_frequency)

# Выводим расшифрованный текст
print("\nРасшифрованный текст:", cracked_text)
Соседние файлы в папке ЛР1