Pushing files
This commit is contained in:
3
README.md
Normal file
3
README.md
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
## Решение задания отборочного этапа инженерной олимпиады Технического университета УГМК ##
|
||||||
|
|
||||||
|
Использование: python3 mains.py
|
||||||
7
decrypt.txt
Normal file
7
decrypt.txt
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
|
||||||
|
Эруе мгд вкъвыщёьквн ЕНХФ Ёвчг хфз аулёщвчаикя иаънтфэ. С щччт уэоннчс н мыжтзысжчсж отйфтккихзшш БАЗШ. Чкна фбб ифилёйвогцм еуеи Ключ для рас- гифровки технический. (ключ: университет)
|
||||||
|
|
||||||
|
Эыпь юри айьздулсеяь БХЖД Мемв нъё ёщёейгхокоё юптхтящ. И кеьр тяфцзэж з ййгъщкшймря фрпъмйыйуцъь ЗХЧР. Якшь лто нтзнлтьфшрй упмъ Ътбм где оёч- эзесмрмм щъеёрчпнвъч. (ключ: угмк)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
160
mains.py
Normal file
160
mains.py
Normal file
@@ -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()
|
||||||
240
script.py
Normal file
240
script.py
Normal file
@@ -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()
|
||||||
1
shifrotext.txt
Normal file
1
shifrotext.txt
Normal file
@@ -0,0 +1 @@
|
|||||||
|
Рюьж сух кэяфожоюптя НАЪЖ Щпае ъещ иёршмпавныр стяаёвё. У юзиы ёвббыау т эмпемнефаул ядтжчэюцюйэи ТИЪЭ. Йюыи цёс ъэыршэпчеыэ цьчн Эяла ёрп вид- зызючдпщ днзтыктъмнъ.
|
||||||
BIN
zadanie.png
Normal file
BIN
zadanie.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 146 KiB |
Reference in New Issue
Block a user