Загрузка данных
Задача 1. Caesar Cipher Brute Force
Условие: Перехвачен шифротекст "Wkh vhfuhw phvvdjh lv klgghq". Известно, что использован шифр Цезаря. Напишите скрипт, который автоматически перебирает все 26 сдвигов и находит осмысленный текст.
Решение:
python
def caesar_bruteforce(ciphertext):
for shift in range(26):
decrypted = ""
for char in ciphertext:
if char.isalpha():
base = ord('A') if char.isupper() else ord('a')
decrypted += chr((ord(char) - base - shift) % 26 + base)
else:
decrypted += char
print(f"Shift {shift:2d}: {decrypted}")
caesar_bruteforce("Wkh vhfuhw phvvdjh lv klgghq")
Ответ: Сдвиг 3 → "The secret message is hidden"
Задача 2. ROT13 и разведка через частотный анализ
Условие: Дан текст "Gur cnffjbeq vf FhcreFrperg123". Определите тип шифра, расшифруйте его и напишите функцию, которая автоматически определяет ROT13 (без перебора).
Решение:
python
import codecs
cipher = "Gur cnffjbeq vf FhcreFrperg123"
# ROT13 — сам себе обратный
decrypted = codecs.decode(cipher, 'rot_13')
print(f"Расшифровано: {decrypted}")
# Автоопределение: ROT13 даёт осмысленный текст с частыми 'e','t','a'
def is_english(text):
common = "etaoin shrdlu"
return sum(1 for c in text.lower() if c in common) / len(text) > 0.5
if not is_english(cipher):
print("Похоже на ROT13:", codecs.decode(cipher, 'rot_13'))
Ответ: "The password is SuperSecret123"
Задача 3. XOR-шифр с известным ключом (single-byte)
Условие: Шифротекст получен XOR-ом каждого символа с одним байтом ключа:
[0x2b, 0x3f, 0x3c, 0x3d, 0x20, 0x2e, 0x3f, 0x3c, 0x20, 0x3a, 0x3f, 0x3b]
Найдите ключ и расшифруйте сообщение. Подсказка: в открытом тексте есть слово "secret".
Решение:
python
cipher = [0x2b, 0x3f, 0x3c, 0x3d, 0x20, 0x2e, 0x3f, 0x3c, 0x20, 0x3a, 0x3f, 0x3b]
target = "secret"
# XOR первого байта с 's' даёт кандидат в ключ
for key in range(256):
decrypted = ''.join(chr(b ^ key) for b in cipher)
if decrypted.startswith("secret"):
print(f"Ключ: {key} (0x{key:02x})")
print(f"Текст: {decrypted}")
break
Ответ: Ключ 0x5A, текст "secret hacker"
Задача 4. Vigenère Cipher — ручная реализация
Условие: Реализуйте шифр Виженера (шифрование и дешифрование) для ключа "HACK". Зашифруйте строку "PYTHONRULES" и проверьте обратимость.
Решение:
python
def vigenere(text, key, mode='encrypt'):
result = ""
key = key.upper()
ki = 0
for char in text.upper():
if char.isalpha():
shift = ord(key[ki % len(key)]) - ord('A')
if mode == 'decrypt':
shift = -shift
result += chr((ord(char) - ord('A') + shift) % 26 + ord('A'))
ki += 1
else:
result += char
return result
plain = "PYTHONRULES"
key = "HACK"
enc = vigenere(plain, key, 'encrypt')
dec = vigenere(enc, key, 'decrypt')
print(f"Открытый: {plain}")
print(f"Шифротекст: {enc}")
print(f"Обратно: {dec}")
assert dec == plain
Ответ: "PYTHONRULES" → "WYYHOVEYYVK" (и обратно)
Задача 5. Base64 + ROT13 (двойное кодирование)
Условие: Перехвачена строка:
"U0dWc2JHOTBhR1Z5SUhObFkzSmxkQT09"
Известно, что злоумышленник применил сначала ROT13, потом Base64. Восстановите исходное сообщение.
Решение:
python
import base64
import codecs
data = "U0dWc2JHOTBhR1Z5SUhObFkzSmxkQT09"
# Шаг 1: Base64 decode
step1 = base64.b64decode(data).decode()
print(f"После Base64: {step1}")
# Шаг 2: ROT13 decode
step2 = codecs.decode(step1, 'rot_13')
print(f"Итог: {step2}")
Ответ: "secret hacker"