240 lines
9.4 KiB
Python
240 lines
9.4 KiB
Python
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() |