876.84K

Пр_9 (11.04)

1.

Атаки на
криптографические
протоколы и их защита
Модель угроз Dolev-Yao · MITM · Replay · Слабые ключи · Побочные
каналы · Защитные механизмы

2.

Модель угроз Dolev-Yao (1983)
Формальная модель для анализа безопасности протоколов.
Злоумышленник Ева контролирует весь канал связи.
Ева может
Перехватывать любые сообщения
Модифицировать и подменять отправителя
Вставлять повторные (старые) сообщения
Анализировать время ответа
Ева не может
Взломать криптостойкий алгоритм за разумное время
Нарушить математические основы шифра
→ Наиболее сильная и реалистичная модель для анализа
протоколов.

3.

Атака «Человек посередине» (MITM)
Принцип на примере Диффи-Хеллмана
Без аутентификации Ева подменяет публичные ключи и
устанавливает два независимых ключа — с Алисой и с Бобом.
Условие успеха: отсутствие аутентификации сторон.
Защита: подписи, сертификаты, аутентификация ключей

4.

Математика MITM и защита хэшированием
Подмена ключа на единицу
Обнаружение через хэш ключа
Ева отправляет A' = 1 и B' = 1:
1. Алиса → Боб: g^a
Алиса: (B')^a mod p = 1^a = 1
2. Боб → Алиса: g^b, H(K)
3. Алиса → Боб: H(K)
Боб: (A')^b mod p = 1^b = 1
Общий ключ = 1 — полностью скомпрометирован.
Ева не знает настоящий K = g^(ab) и не может подделать
SHA256(K). Передача первых 8 байт (64 бита) достаточна
для обнаружения подмены.

5.

Атаки на повтор (Replay Attack)
Повторная отправка ранее перехваченного корректного сообщения. Без защиты
— одно сообщение может быть исполнено многократно.
Пример
«Перевести $100 Бобу» — подпись действительна. Ева повторяет 10 раз →
двойное списание.
Последствия
Двойное списание средств
Повторная аутентификация
DoS-атака на сервис
Ключевой принцип защиты
Каждое сообщение должно быть уникальным — через Nonce или
Timestamp.

6.

Защита от Replay: Nonce и Timestamp
Метод 1: Nonce
Метод 2: Timestamp (TOTP)
1. Сервер → Клиент: случайное число N
TOTP = F(secret, UnixTime / 30)
2. Клиент → Сервер: hash(N + secret)
3. Сервер запоминает все использованные N
Сервер принимает, если:
|T_получения − T_отправки| < ΔT
Повторное N отвергается.
Окно = 5 минут — стандарт TOTP (RFC 6238)

7.

Слабые ключи и уязвимость RC4
Примеры слабых ключей
Проверка ключей на слабость
Алгоритм
Слабый ключ
Уязвимость
DES
0x010101010101
Половина
0101
подключей
Энтропия ≥ 7 бит/байт
Нет повторяющихся байт (3+ подряд)
Ключ ≠ известный слабый (все нули)
Не производный от пароля без соли
совпадает
RC4
RSA
K[0]=0, K[1]=0
d < n^(1/4)
Первые байты
if key.count(0) > len(key)/4 → weak
потока = 0
if entropy(key) < 6 → weak
Атака Винера
Для K=[0,0,0]: после KSA → S[0]=0, S[1]=0 →
первый байт потока = 0

8.

Атаки по побочным каналам
Timing Attack
Функция memcmp возвращает ошибку при первом несовпадении. Ева
измеряет время и угадывает побайтово:
«AAAAAA» → выход после 1 символа → 10 мс
«SAAAAA» → выход после 2 символов → 20 мс
→ Первый символ = 'S'. Всего 156 попыток вместо 308 миллионов.
Другие каналы: потребляемая мощность, звук, EM-излучение.

9.

Constant-Time Сравнение и Сводная Таблица Защиты
Защита от Timing Attack
def const_cmp(a, b):
if len(a) != len(b): return False
res = 0
for i in range(len(a)):
Угрозы и защиты
Угроза
Защита
Пример
MITM
Аутентификация
TLS, SIGMA
Replay
Nonce /
Kerberos, TOTP
res |= a[i] ^ b[i]
Timestamp
return res == 0
Weak key
XOR не зависит от значения байт
|= накапливает разницу
Цикл всегда выполняется полностью
Проверка
NIST SP 800-90
энтропии
Timing
Constant-time
crypto_verify_32
Padding oracle
Фиксированный
TLS 1.3
паддинг
Современный протокол ≠ автоматически защищён.

10.

Резюме: теория для практических
задач
01
Задачи №1–2: DH и MITM
Подмена ключа на 1, обнаружение через SHA256(K)
02
Задачи №3–4: Replay
Nonce и Timestamp (TOTP, RFC 6238)
03
Задачи №5–6: Слабые ключи
RC4 KSA/PRGA, проверка энтропии
04
Задачи №7–8: Побочные каналы
Timing attack, constant-time сравнение
Совет: держите эти слайды открытыми во время решения задач.

11.

12.

Атаки на
криптографические
протоколы и методы
защиты
Практическое занятие №9 · 90 минут
Моделируем 4 типа атак и отрабатываем 4 метода защиты.
Инструменты: калькулятор, онлайн-компилятор (replit.com,
onecompiler.com), консоль браузера (F12).

13.

ПЛАН ЗАНЯТИЯ
Структура и формат
Раздел
Время
Задачи
MITM
15 мин
№1, №2
Атаки на повтор
20 мин
№3, №4
(Replay)
Задачи №1, 3, 5, 7 — калькулятор / ручной расчёт
Задачи №2, 4, 6, 8 — код в онлайн-компиляторе
Каждая пара задач: сначала теоретический расчёт,
затем практическая реализация в коде.
Слабые ключи
20 мин
№5, №6
Побочные
25 мин
№7, №8
8 мин

каналы и
защита
Резерв / разбор
Правила работы

14.

РАЗМИНКА · MITM
Задача №1 — Перехват ключа Диффи-Хеллмана
Дано
p = 23, g = 5 Алиса: a = 6 · Боб: b = 15 Ева
подменяет оба публичных значения на 1
Вопросы
1.
Какой ключ установит Алиса с «Бобом»?
2. Какой ключ установит Боб с «Алисой»?
3. Почему атака возможна без взлома DH?

15.

РАЗМИНКА · MITM
Задача №2 — Обнаружение MITM через хэш
ключа
Условие
import hashlib, secrets
Алиса отправляет Бобу пару (E_K("message"), H(K)). Ева
подменяет ключ K → K' и пересылает с H(K').
K = secrets.token_bytes(4)
Задание: запустите код, сравните хэши, определите —
K_evil = secrets.token_bytes(4)
обнаружит ли Боб подмену?
h_orig = hashlib.sha256(K).hexdigest()[:8]
h_evil = hashlib.sha256(K_evil).hexdigest()[:8]
print("Оригинальный хэш:", h_orig)
print("Хэш от ключа Евы:", h_evil)
print("Боб обнаружит атаку?", h_orig != h_evil)

16.

АТАКИ НА ПОВТОР · REPLAY
Задача №3 — TOTP и атака
повторного воспроизведения
Сценарий
Вопрос
Банковский перевод: TOTP =
Будет ли принят пароль 5839
(PIN + Timestamp) mod 10⁴ PIN
через 2 часа? Как банк должен
= 1234, Timestamp = 460 Ева
защититься?
перехватила старый TOTP =
5839

17.

АТАКИ НА ПОВТОР · REPLAY
Задача №4 — Протокол с nonce против повтора
Задание
import hashlib, os
Реализуйте протокол «запрос-ответ» с защитой от
повтора:
nonce = int.from_bytes(os.urandom(8), 'big')
Сервер генерирует nonce (случайное 64-битное число)
secret = b"shared_key_123"
Клиент отвечает: hash(nonce + shared_secret)
Сервер отклоняет повторный ответ
def respond(n, s):
return hashlib.sha256(
str(n).encode() + s
).hexdigest()[:12]
ans = respond(nonce, secret)
print(f"Nonce: {nonce}, Ответ: {ans}")
print("Повтор старого ответа: REJECTED")

18.

СЛАБЫЕ КЛЮЧИ
Задача №5 — Слабый ключ RC4
Дано
Ключ RC4: K = [0x01, 0x02, 0x03, 0x00,
0x00, 0x00] Первые байты ключевого
потока слабо зависят от ключа.
Вопрос
Рассчитайте первые 2 байта потока для K =
[0, 0, 0]. Почему такие ключи опасны?
Решение

19.

СЛАБЫЕ КЛЮЧИ
Задача №6 — Проверка ключа на энтропию
Задание
Напишите функцию проверки ключа. Критерии:
Длина ≥ 128 бит
Нулевых байт ≤ 25%
Нет 3+ одинаковых байт подряд
Выход: "Strong" или "Weak" + причина
Пример: [0xAA, 0xAA, 0xAA, 0x01, 0x02] → Weak (повтор
0xAA)
def check_key(key):
if len(key) < 16:
return "Weak: короткий ключ"
zeros = key.count(0) / len(key)
if zeros > 0.25:
return "Weak: много нулей"
for i in range(len(key)-2):
if key[i]==key[i+1]==key[i+2]:
return "Weak: повтор байтов"
return "Strong"
keys = [
bytes(range(16)),
b"\xAA\xAA\xAA\x01\x02",
b"\x00"*20
]
for k in keys:
print(check_key(k))

20.

ПОБОЧНЫЕ КАНАЛЫ
Задача №7 — Атака по времени (Timing Side-Channel)
Уязвимый код
for i in range(len(correct)):
if password[i] != correct[i]:
return False
wait(10 ms)
return True
Пароль: "SECRET" (6 символов) "AAAAAA" → 10 мс "SAAAAA" →
20 мс
Вопросы
1.
Какой символ угадала Ева?
2. Сколько попыток для подбора (26 букв)?
3. Как исправить?

21.

ПОБОЧНЫЕ КАНАЛЫ
Задача №8 — Безопасное сравнение
Задание
def constant_time_cmp(a, b):
Напишите constant_time_cmp(a, b), которая:
Не возвращает раньше при несовпадении первых байтов
Работает за O(n) всегда
Использует только XOR и аккумуляцию
Проверьте: время для "secret" и "seXXXX" должно быть одинаковым.
if len(a) != len(b):
return False
res = 0
for x, y in zip(a, b):
res |= x ^ y
return res == 0
# Тест
print(constant_time_cmp(b"secret", b"seXXXX"))
# False — но время выполнения одинаковое
English     Русский Rules