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

ЛР1 / LR1_decrypt

.py
Скачиваний:
7
Добавлен:
18.06.2024
Размер:
5 Кб
Скачать
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