К списку уроков

Урок 7. Crypto Kids

Онлайн и в Б-835, 20 ноября (четверг), 15:00

Так ли вы уверены, что ваши данные передаются безопасно? Чтобы в этом убедиться (или разуверить себя), мы переходим к КРИПТОГРАФИИ

1. Введение: Три кита обработки данных

Самая частая ошибка новичка — путать кодировку, хеширование и шифрование. Давайте раз и навсегда разберемся с определениями.

Кодирование (Encoding)

Это преобразование данных в удобный формат для хранения или передачи.

  • Ключ не нужен. Любой может раскодировать обратно, зная алгоритм.

  • Пример: Base64, ASCII, азбука Морзе.

Хеширование (Hashing)

Преобразование данных любой длины в набор битов фиксированной длины (число).

  • Необратимо. Из хеша нельзя получить исходные данные (в теории).

  • Пример: MD5, SHA-256.

Шифрование (Encryption)

Сокрытие информации с помощью ключа.

  • Обратимо. Если есть ключ, можно вернуть исходный текст.

2. История: Классические шифры

В заданиях категории "Crypto" (особенно простых) часто встречаются старые алгоритмы.

  • Шифр Цезаря (Caesar Cipher): Один из самых простых методов. Каждая буква заменяется на букву, находящуюся на фиксированное число позиций правее или левее в алфавите.

  • Шифр Атбаш (Atbash): Шифр подстановки: первая буква алфавита заменяется на последнюю, вторая — на предпоследнюю и так далее (A->Z, B->Y).

  • Шифр Виженера (Vigenère Cipher): Более сложный шифр. Использует ключевое слово. Каждая буква исходного текста сдвигается на разное количество позиций в зависимости от буквы ключа.

    • Пример: Текст "здесь ничего интересного", Ключ "цтф" -> Шифротекст "юцщзо...".

  • Энигма (Enigma): Легендарная роторная машина. При каждом нажатии клавиши роторы сдвигались, меняя электрическую цепь. Это делало подбор ключа невероятно сложным для того времени.

3. Кодировки (Encodings)

В CTF вы постоянно будете видеть данные, которые выглядят как "мусор". Часто это просто другая кодировка.

ASCII и Unicode

Компьютер понимает только цифры. Таблицы кодировок сопоставляют каждому символу число.

  • В Python полезны функции ord(symbol) (символ в число) и chr(int) (число в символ).

Bin, Hex и Base64

  • Binary: Представление в виде 0 и 1.

  • Hex (Base16): Шестнадцатеричное представление. Удобно для просмотра байтов.

  • Base64: Самая популярная кодировка в вебе. Использует цифры, буквы (A-Z, a-z) и символы +, /. Часто заканчивается на =.

import base64
base64.b64encode(b'hello')  # Кодировать
base64.b64decode(b'aGVsbG8=') # Декодировать

import binascii
binascii.hexlify(b'text')   # Текст в hex

4. Хеширование (Hashing)

Хеш — это "цифровой отпечаток" данных. Он детерминирован (один вход = один выход) и работает в одну сторону.

Зачем нужно?

  • Хранение паролей (сервер хранит не пароль, а его хеш).

  • Проверка целостности файлов.

Как ломать хеши? Поскольку хеш необратим, мы не "расшифровываем" его, а подбираем (брутфорс). Мы хешируем варианты паролей и сравниваем с украденным хешем.

  • Радужные таблицы (Rainbow Tables): Предварительно вычисленные базы "хеш -> пароль". Ускоряют взлом.

Инструменты:

  • John The Ripper (JTR): Легендарный инструмент, поддерживает кучу алгоритмов.

  • Hashcat: Мощнейший инструмент, использующий видеокарту (GPU) для перебора.

5. Шифрование (Encryption)

Здесь уже есть ключи.

Симметричное шифрование

Один и тот же ключ используется и для шифрования, и для расшифрования.

  • AES (Advanced Encryption Standard): Современный стандарт. Быстрый и надежный блочный шифр.

  • DES: Устаревший стандарт, сейчас считается небезопасным.

Асимметричное шифрование

Используется пара ключей: Публичный (раздаем всем) и Приватный (храним в тайне).

  • Если зашифровать Публичным -> Расшифровать может только Приватный (для секретных сообщений).

  • Если зашифровать Приватным -> Расшифровать может Публичный (для цифровой подписи).

Популярные алгоритмы:

  • RSA: Основан на сложности разложения больших чисел на множители.

  • Diffie-Hellman: Алгоритм безопасного обмена ключами по незащищенному каналу.

6. Принцип Керкгоффса

Золотое правило криптографии:

Система не должна требовать секретности алгоритма. Безопасность должна зависеть только от секретности ключа.

Если кто-то говорит: "Мой шифр надежен, потому что никто не знает, как он работает" — это плохой шифр.

7. Полезные инструменты

  • CyberChef: "Швейцарский нож" для декодирования всего (Base64, Hex, XOR и т.д.).

  • OpenSSL: Консольная утилита для генерации ключей и шифрования.

  • SageMath: Математическая среда для сложных криптографических задач (RSA, ECC).

  • CryptoTool2: Визуальный инструмент для изучения алгоритмов.