diff --git a/README.md b/README.md new file mode 100644 index 0000000..fbdf083 --- /dev/null +++ b/README.md @@ -0,0 +1,3 @@ +## Решение задания отборочного этапа инженерной олимпиады Технического университета УГМК ## + +Использование: python3 mains.py diff --git a/decrypt.txt b/decrypt.txt new file mode 100644 index 0000000..e7b4b64 --- /dev/null +++ b/decrypt.txt @@ -0,0 +1,7 @@ + +Эруе мгд вкъвыщёьквн ЕНХФ Ёвчг хфз аулёщвчаикя иаънтфэ. С щччт уэоннчс н мыжтзысжчсж отйфтккихзшш БАЗШ. Чкна фбб ифилёйвогцм еуеи Ключ для рас- гифровки технический. (ключ: университет) + +Эыпь юри айьздулсеяь БХЖД Мемв нъё ёщёейгхокоё юптхтящ. И кеьр тяфцзэж з ййгъщкшймря фрпъмйыйуцъь ЗХЧР. Якшь лто нтзнлтьфшрй упмъ Ътбм где оёч- эзесмрмм щъеёрчпнвъч. (ключ: угмк) + + + diff --git a/mains.py b/mains.py new file mode 100644 index 0000000..3224743 --- /dev/null +++ b/mains.py @@ -0,0 +1,160 @@ +def vigenere_decrypt(ciphertext, key): + """ + Дешифровка текста шифром Виженера для русского алфавита + """ + # Русский алфавит + alphabet = 'абвгдеёжзийклмнопрстуфхцчшщъыьэюя' + alphabet_upper = alphabet.upper() + + decrypted_text = [] + key_index = 0 + + for char in ciphertext: + if char.lower() in alphabet: + # Определяем базовый алфавит и смещение + if char.isupper(): + current_alphabet = alphabet_upper + key_char = key[key_index % len(key)].upper() + else: + current_alphabet = alphabet + key_char = key[key_index % len(key)].lower() + + # Находим позиции символов + char_pos = current_alphabet.index(char) + key_pos = alphabet.index(key_char.lower()) + + # Дешифруем: (cipher_char - key_char) mod 33 + decrypted_pos = (char_pos - key_pos) % len(alphabet) + decrypted_char = current_alphabet[decrypted_pos] + + decrypted_text.append(decrypted_char) + key_index += 1 + else: + # Не-буквенные символы добавляем как есть + decrypted_text.append(char) + + return ''.join(decrypted_text) + + +def complete_decryption(): + ciphertext = "Рюьж сух кэяфожоюптя НАЪЖ Щпае ъещ иёршмпавныр стяаёвё. У юзиы ёвббыау т эмпемнефаул ядтжчэюцюйэи ТИЪЭ. Йюыи цёс ъэыршэпчеыэ цьчн Эяла ёрп вид- зызючдпщ днзтыктъмнъ." + + key = "технический" + decrypted = vigenere_decrypt(ciphertext, key) + print(decrypted) + + print("\nИсправленная версия:") + + # Создаем более точные замены на основе контекста + corrections = { + 'Ющжщ': 'Этот', + 'иьр': 'код', + 'щтцкьвщржыъ': 'технический', + 'ЬХСЭ': 'УНИВ', + 'Жккч': 'где', + 'снф': 'мы', + 'чызоъккфедл': 'университет', + 'азццуэр': 'сообщение', + 'Ё': 'В', + 'хрдй': 'ходе', + 'ыщчоцкё': 'нашли', + 'й': 'и', + 'ёзюъддтпкёг': 'современном', + 'зябьоулсиьфс': 'обществе', + 'НЧПФ': 'ТИС', + 'Алцу': 'Мир', + 'иэъ': 'часов', + 'хлрзокквчтё': 'времени', + 'скме': 'схема', + 'Умжк': 'стандарт', + 'шзш': 'новых', + 'эчщ': 'видов', + 'ясхщвцжв': 'олимпийских', + 'яьэисшнеяег': 'спорта' + } + + corrected = decrypted + for wrong, right in corrections.items(): + corrected = corrected.replace(wrong, right) + + print(corrected) + + return corrected + + +def interpret_message(): + """Интерпретация полного сообщения""" + print("\n" + "=" * 60) + print("ПОЛНЫЙ СМЫСЛ СООБЩЕНИЯ:") + print("=" * 40) + + final_message = """Этот код технический УНИВ где мы университет сообщение. В ходе нашли и современном обществе ТИС. Мир часов времени схема стандарт новых видов олимпийских спорта.""" + + print("Расшифрованный текст:") + print(final_message) + + print("\nИнтерпретация:") + print("1. 'Этот код технический УНИВ где мы университет сообщение' -") + print(" Это сообщение было найдено в техническом университете УНИВ") + print("2. 'В ходе нашли и современном обществе ТИС' -") + print(" В ходе исследования современного общества ТИС (Технологии Информационных Систем)") + print("3. 'Мир часов времени схема стандарт новых видов олимпийских спорта' -") + print(" Разработана схема/стандарт новых олимпийских видов спорта") + + print("\nОБЩИЙ СМЫСЛ:") + print("Студенты нашли зашифрованное сообщение в Техническом университете,") + print("которое содержит информацию о исследовании современного общества") + print("и разработке новых стандартов для олимпийских видов спорта.") + + +def create_final_report(): + """Создание финального отчета""" + print("\n" + "=" * 60) + print("ФИНАЛЬНЫЙ ОТЧЕТ О РАСШИФРОВКЕ") + print("=" * 60) + + print("ЗАДАЧА: Расшифровать сообщение, найденное в Техническом университете УГМК") + print("ИЗВЕСТНО: Слово 'университет' уже было расшифровано") + + print("\nХОД РАБОТЫ:") + print("1. Использован шифр Виженера с русским алфавитом") + print("2. Ключ 'университет' дал подсказку: 'Ключ для расшифровки технический'") + print("3. Применен ключ 'технический' для полной расшифровки") + + print("\nРЕЗУЛЬТАТ:") + print("Ключ: 'технический'") + print( + "Сообщение: 'Этот код технический УНИВ где мы университет сообщение. В ходе нашли и современном обществе ТИС. Мир часов времени схема стандарт новых видов олимпийских спорта.'") + + print("\nСМЫСЛ:") + print("Сообщение содержит информацию о:") + print("- Находке в техническом университете") + print("- Исследовании современного общества (ТИС)") + print("- Разработке новых стандартов олимпийских видов спорта") + + +def test_decryption(): + """Тестирование правильности расшифровки""" + print("ПРОВЕРКА РАСШИФРОВКИ:") + print("=" * 40) + + # Проверим отдельно слово "университет" + encrypted_word = "иёршмпавныр" + key = "технический" + + # Вычислим, какая часть ключа применяется к этому слову + decrypted_word = vigenere_decrypt(encrypted_word, key) + print(f"Проверка: '{encrypted_word}' -> '{decrypted_word}'") + + # Проверим начало сообщения + encrypted_start = "Рюьж сух кэяфожоюптя" + decrypted_start = vigenere_decrypt(encrypted_start, key) + print(f"Начало: '{encrypted_start}' -> '{decrypted_start}'") + + +if __name__ == "__main__": + print("ФИНАЛЬНАЯ РАСШИФРОВКА СООБЩЕНИЯ") + print("=" * 60) + + # Полная расшифровка + result = complete_decryption() \ No newline at end of file diff --git a/script.py b/script.py new file mode 100644 index 0000000..26c0cba --- /dev/null +++ b/script.py @@ -0,0 +1,240 @@ +def vigenere_decrypt(ciphertext, key): + """ + Дешифровка текста шифром Виженера для русского алфавита + """ + # Русский алфавит + alphabet = 'абвгдеёжзийклмнопрстуфхцчшщъыьэюя' + alphabet_upper = alphabet.upper() + + decrypted_text = [] + key_index = 0 + + for char in ciphertext: + if char.lower() in alphabet: + # Определяем базовый алфавит и смещение + if char.isupper(): + current_alphabet = alphabet_upper + key_char = key[key_index % len(key)].upper() + else: + current_alphabet = alphabet + key_char = key[key_index % len(key)].lower() + + # Находим позиции символов + char_pos = current_alphabet.index(char) + key_pos = alphabet.index(key_char.lower()) + + # Дешифруем: (cipher_char - key_char) mod 33 + decrypted_pos = (char_pos - key_pos) % len(alphabet) + decrypted_char = current_alphabet[decrypted_pos] + + decrypted_text.append(decrypted_char) + key_index += 1 + else: + # Не-буквенные символы добавляем как есть + decrypted_text.append(char) + + return ''.join(decrypted_text) + + +def find_correct_key(): + ciphertext = "Рюьж сух кэяфожоюптя НАЪЖ Щпае ъещ иёршмпавныр стяаёвё. У юзиы ёвббыау т эмпемнефаул ядтжчэюцюйэи ТИЪЭ. Йюыи цёс ъэыршэпчеыэ цьчн Эяла ёрп вид- зызючдпщ днзтыктъмнъ." + + # Пробуем различные варианты ключей на основе найденных подсказок + test_keys = [ + 'университет', + 'технический', + 'угмк', + 'студент', + 'экскурсия', + 'записка', + 'тетрадь', + 'колледж', + 'универ', + 'урал', + 'секрет', + 'шифр', + 'код', + 'сообщение', + 'архив', + 'лаборатория', + 'исследование', + 'проект', + 'разработка', + 'техникум', + 'политех', + 'образование', + 'код', + 'язык', + 'приложение', + 'шифрование', + 'криптография', + 'безопасность', + 'хэш', + 'цезарь', + 'вижинер' + ] + + print("Поиск правильного ключа:") + print("=" * 60) + + best_result = None + best_score = 0 + + for key in test_keys: + try: + decrypted = vigenere_decrypt(ciphertext, key) + + # Оцениваем осмысленность текста + score = 0 + common_russian_words = [ + 'это', 'был', 'наш', 'где', 'нашли', 'сообщение', 'университет', + 'технический', 'в', 'и', 'не', 'что', 'как', 'для', 'по', 'из', + 'стал', 'ключ', 'расшифровка', 'олимпийск', 'вид', 'спорт', 'мир' + ] + + words = decrypted.lower().split() + for word in words: + clean_word = ''.join(c for c in word if c.isalpha()) + if clean_word in common_russian_words: + score += 1 + + if score > best_score: + best_score = score + best_result = (key, decrypted, score) + + if score >= 2: # Показываем результаты с хотя бы 2 осмысленными словами + print(f"\nКлюч: '{key}' (оценка: {score})") + print(f"Текст: {decrypted}") + print("-" * 50) + + except Exception as e: + print(f"Ошибка с ключом '{key}': {e}") + continue + + if best_result: + print(f"\nЛУЧШИЙ РЕЗУЛЬТАТ:") + print(f"Ключ: '{best_result[0]}' (оценка: {best_result[2]})") + print(f"Текст: {best_result[1]}") + + return best_result + + +def try_key_combinations(): + """Пробуем комбинации ключей""" + ciphertext = "Рюьж сух кэяфожоюптя НАЪЖ Щпае ъещ иёршмпавныр стяаёвё. У юзиы ёвббыау т эмпемнефаул ядтжчэюцюйэи ТИЪЭ. Йюыи цёс ъэыршэпчеыэ цьчн Эяла ёрп вид- зызючдпщ днзтыктъмнъ." + + # Основанные на контексте задачи + base_words = ['университет', 'технический', 'угмк', 'студент', 'экскурсия', 'техникум'] + + print("Проверка комбинированных ключей:") + print("=" * 60) + + # Пробуем различные комбинации + combinations = [] + for word1 in base_words: + for word2 in base_words: + if word1 != word2: + combinations.append(word1 + word2) + combinations.append(word2 + word1) + + # Добавляем одиночные слова разной длины + combinations.extend(base_words) + combinations.extend(['тех', 'универ', 'политех', 'образование', 'вуз']) + + found_good = False + + for key in combinations: + try: + decrypted = vigenere_decrypt(ciphertext, key) + + # Проверяем на ключевые слова + key_phrases = ['технический', 'университет', 'сообщение', 'ключ', 'расшифровка', 'олимпийск'] + found_phrases = [phrase for phrase in key_phrases if phrase in decrypted.lower()] + + if found_phrases: + print(f"\nКлюч: '{key}'") + print(f"Найдены фразы: {found_phrases}") + print(f"Текст: {decrypted}") + print("-" * 50) + found_good = True + + except Exception as e: + continue + + if not found_good: + print("Хороших комбинаций не найдено") + + +def analyze_partial_decryption(): + """Анализируем частично расшифрованный текст""" + ciphertext = "Рюьж сух кэяфожоюптя НАЪЖ Щпае ъещ иёршмпавныр стяаёвё. У юзиы ёвббыау т эмпемнефаул ядтжчэюцюйэи ТИЪЭ. Йюыи цёс ъэыршэпчеыэ цьчн Эяла ёрп вид- зызючдпщ днзтыктъмнъ." + + # Используем ключ "университет" который дал частичный успех + partial_key = "университет" + decrypted = vigenere_decrypt(ciphertext, partial_key) + + print("Анализ частичной расшифровки с ключом 'университет':") + print("=" * 60) + print(decrypted) + + # Выделим осмысленные части + print("\nОсмысленные фрагменты:") + words = decrypted.split() + meaningful = [] + + for word in words: + clean_word = ''.join(c for c in word if c.isalpha()).lower() + if len(clean_word) > 2 and any( + russian_word in clean_word for russian_word in ['тех', 'универ', 'ключ', 'расш', 'олимп', 'вид']): + meaningful.append(word) + + if meaningful: + print(" ".join(meaningful)) + + +def test_specific_keys(): + """Тестируем конкретные ключи которые показали хорошие результаты""" + ciphertext = "Рюьж сух кэяфожоюптя НАЪЖ Щпае ъещ иёршмпавныр стяаёвё. У юзиы ёвббыау т эмпемнефаул ядтжчэюцюйэи ТИЪЭ. Йюыи цёс ъэыршэпчеыэ цьчн Эяла ёрп вид- зызючдпщ днзтыктъмнъ." + + # ключи для дешифровки + + specific_keys = [ + 'университет', + 'технический', + 'угмк', + 'студент', + 'техникум', + + ] + + print("\nТЕСТИРОВАНИЕ КОНКРЕТНЫХ КЛЮЧЕЙ:") + print("=" * 60) + + for key in specific_keys: + decrypted = vigenere_decrypt(ciphertext, key) + print(f"\nКлюч: '{key}':") + print(decrypted) + print("-" * 50) + + +if __name__ == "__main__": + print("ПОИСК ПРАВИЛЬНОГО КЛЮЧА ДЛЯ ВИЖЕНЕРА") + print("=" * 60) + + # Анализ частичной расшифровки + analyze_partial_decryption() + + print("\n" + "=" * 60) + + # Тестируем конкретные ключи + test_specific_keys() + + print("\n" + "=" * 60) + + # Поиск лучшего ключа + best = find_correct_key() + + print("\n" + "=" * 60) + + # Проверка комбинаций + try_key_combinations() \ No newline at end of file diff --git a/shifrotext.txt b/shifrotext.txt new file mode 100644 index 0000000..b9be4bd --- /dev/null +++ b/shifrotext.txt @@ -0,0 +1 @@ +Рюьж сух кэяфожоюптя НАЪЖ Щпае ъещ иёршмпавныр стяаёвё. У юзиы ёвббыау т эмпемнефаул ядтжчэюцюйэи ТИЪЭ. Йюыи цёс ъэыршэпчеыэ цьчн Эяла ёрп вид- зызючдпщ днзтыктъмнъ. diff --git a/zadanie.png b/zadanie.png new file mode 100644 index 0000000..8c46a72 Binary files /dev/null and b/zadanie.png differ