Криптография: симметричное и асимметричное шифрование
Классические шифры, AES и RSA, хеш-функции, электронная подпись и обмен ключами — база для курсовых по информационной безопасности.
Криптография решает четыре задачи: конфиденциальность (никто не прочитает), целостность (никто не изменит незаметно), аутентичность (отправитель тот, за кого себя выдаёт) и неотказуемость (нельзя отрицать авторство). Разные механизмы закрывают разные задачи.
Классические шифры — с них начинают курсовые
| Шифр | Принцип | Стойкость |
|---|---|---|
| Цезаря | Сдвиг алфавита на k позиций | 25 вариантов — перебор мгновенный |
| Виженера | Сдвиг по ключевому слову | Ломается анализом длины ключа (метод Касиски) |
| Вернама | XOR со случайным ключом длиной с текст | Абсолютно стойкий при одноразовом ключе |
| Перестановки | Меняется порядок символов | Частотный анализ работает, буквы те же |
def caesar(text: str, k: int) -> str:
res = []
for ch in text:
if 'а' <= ch.lower() <= 'я':
base = ord('а') if ch.islower() else ord('А')
res.append(chr((ord(ch) - base + k) % 32 + base))
else:
res.append(ch)
return ''.join(res)
print(caesar('привет', 3)) # тулезх
print(caesar(caesar('привет', 3), -3)) # привет
Симметричное шифрование
Один ключ и для шифрования, и для расшифрования. Быстрое, подходит для больших объёмов. Главная проблема — как передать ключ по незащищённому каналу.
- AES — мировой стандарт, ключи 128/192/256 бит, блок 128 бит.
- ГОСТ Р 34.12-2015 «Кузнечик» — российский стандарт, блок 128 бит, ключ 256 бит.
- Режимы работы важнее самого алгоритма: ECB небезопасен (одинаковые блоки шифруются одинаково), применяют CBC, CTR, а лучше GCM с проверкой целостности.
Асимметричное шифрование
Два связанных ключа: открытый шифрует, закрытый расшифровывает. Открытый можно публиковать — проблема передачи ключа исчезает. Расплата: работает в сотни раз медленнее симметричного.
RSA: 1. Выбрать простые p и q, вычислить n = p·q 2. φ(n) = (p−1)(q−1) 3. Открытая экспонента e: 1 < e < φ(n), НОД(e, φ(n)) = 1 4. Закрытая d: e·d ≡ 1 (mod φ(n)) Шифрование: c = m^e mod n Расшифрование: m = c^d mod n Стойкость держится на сложности разложения n на множители
Учебный пример: p=11, q=13 → n=143, φ=120, возьмём e=7, тогда d=103. Сообщение m=9: c = 9⁷ mod 143 = 48, обратно 48¹⁰³ mod 143 = 9.
Гибридная схема — как работает на практике
- Генерируется случайный сеансовый ключ для симметричного шифра.
- Данные шифруются этим ключом через AES — быстро.
- Сам сеансовый ключ шифруется открытым ключом получателя через RSA — он короткий, медлительность неважна.
- Получатель расшифровывает сеансовый ключ своим закрытым ключом, затем им расшифровывает данные.
Именно так устроен TLS, на котором работает HTTPS. Это ответ на частый вопрос «что быстрее и что использовать» — используют оба, каждый по своему назначению.
Хеш-функции
Свойства криптографической хеш-функции: • необратимость — по хешу нельзя восстановить исходные данные • стойкость к коллизиям — трудно найти два разных сообщения с одним хешем • лавинный эффект — изменение одного бита меняет примерно половину бит хеша Актуальные: SHA-256, SHA-3, ГОСТ Р 34.11-2012 «Стрибог» Устарели и небезопасны: MD5, SHA-1
Пароли хранят не хешем напрямую, а с солью и медленной функцией — bcrypt, scrypt, Argon2. Быстрый SHA-256 без соли перебирается по словарю за минуты.
Электронная подпись
Подпись — обратное применение асимметрии: хеш документа шифруется закрытым ключом отправителя, проверить может любой открытым. Это даёт целостность, аутентичность и неотказуемость, но не конфиденциальность — документ остаётся читаемым.
- Отправитель считает хеш документа.
- Шифрует хеш своим закрытым ключом — это и есть подпись.
- Получатель расшифровывает подпись открытым ключом отправителя и получает хеш.
- Считает хеш полученного документа сам и сравнивает. Совпало — документ не изменён и подписан владельцем ключа.
Частые вопросы
Почему нельзя просто зашифровать всё через RSA?
Он на два-три порядка медленнее AES и ограничен длиной сообщения размером ключа. Поэтому RSA шифрует только ключ, а данные — симметричный алгоритм.
Что такое соль и зачем она нужна?
Случайная строка, добавляемая к паролю перед хешированием. Она делает бесполезными радужные таблицы: одинаковые пароли разных пользователей дают разные хеши.