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()