Files
UGMK_OLIMP/script.py
2025-11-26 09:35:43 +05:00

240 lines
9.4 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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()