Введение в криптографию: шифрование, хеши и подписи

Чем отличаются кодирование, шифрование, хеширование, MAC и цифровая подпись; безопасный локальный пример и маршрут изучения криптографии.

Криптография помогает скрывать содержимое, обнаруживать подмену и подтверждать происхождение данных. Это несколько разных задач. Для начала полезнее научиться выбирать нужное свойство, чем запоминать длинный список алгоритмов.

В CTF встречаются и исторические шифры, и ошибки применения современных схем. Но длинная строка сама по себе не означает шифртекст: это может быть кодировка, хеш, подпись или произвольные байты. Сначала определите, что дано, какие операции доступны и какое утверждение требуется проверить.

Пять операций, которые нельзя смешивать

ОперацияЧто делаетКакой секрет нужен
Кодирование, например Base64Представляет данные в другом форматеСекрета нет
ШифрованиеСкрывает содержимое от стороны без нужного ключаКлюч расшифрования
Криптографическое хешированиеПолучает компактный отпечаток данныхСекрета нет
MAC, например HMACПроверяет целостность и подлинность для обладателей общего ключаОбщий секретный ключ
Цифровая подписьПозволяет проверять подпись открытым ключомЗакрытый ключ для подписания

Base64 не защищает конфиденциальность: его декодирование предусмотрено форматом и не является взломом. Хеш также не скрывает слабый пароль от проверки догадок. Для хранения паролей используют специализированную функцию с затратами времени и памяти и уникальную соль; обычный быстрый SHA-256 для этой задачи не подходит. См. OWASP Password Storage.

Симметричные и асимметричные схемы

Симметричная схема использует общий секретный ключ. AES — блочный шифр, но имя AES ещё не задаёт способ защиты сообщения: нужны режим, параметры и правила их использования. На практике применяют готовые схемы аутентифицированного шифрования, например AES-GCM или ChaCha20-Poly1305. Они защищают конфиденциальность и проверяют подлинность шифртекста и связанных данных.

У таких схем есть требования к nonce — значению, которое не должно повторяться при данном ключе в режимах, требующих уникальности. Nonce обычно не является секретом; его нельзя путать с ключом. Конкретные правила задаёт схема, а не общее слово «шифрование». Интерфейс AEAD и требования к параметрам описаны в RFC 5116.

В асимметричной криптографии используются открытая и закрытая части ключевого материала. Но не каждая такая схема шифрует сообщения: есть согласование ключей и цифровые подписи. Для RSA стандарт отдельно описывает схемы шифрования RSAES-OAEP и подписания RSASSA-PSS. «Подпись — это шифрование закрытым ключом» — неверная универсальная модель. См. RFC 8017.

Что обещает хеш-функция

Для SHA-256 результат имеет длину 256 бит. Его часто показывают как 64 шестнадцатеричных символа. Это представление результата, а не длина исходного сообщения.

Входов больше, чем возможных хешей, поэтому коллизии неизбежно существуют. Стойкость означает вычислительную трудность решения определённых задач:

  • Прообраз: по заданному хешу найти подходящий вход.
  • Второй прообраз: по заданному сообщению найти другое с тем же хешем.
  • Коллизия: найти любую пару разных сообщений с одинаковым хешем.

Поиск коллизии не требует заранее заданного хеша. Нельзя также обещать, что любое изменение обязательно даст другой результат: это ожидается с крайне высокой вероятностью у подходящей функции, но не является математической невозможностью совпадения. Термины закреплены в глоссарии NIST: preimage resistance, second preimage resistance, collision resistance.

MD5 и SHA-1 не следует выбирать для задач, требующих современной стойкости к коллизиям. При этом «у хеша есть коллизии» не равнозначно «из любого хеша можно получить исходный пароль».

Почему рядом с файлом недостаточно написать SHA-256

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

HMAC добавляет общий секрет: получатель с тем же ключом проверяет тег. Такой получатель также способен создать корректный тег, поэтому HMAC не даёт публично проверяемой подписи автора. В цифровой подписи проверяющий использует открытый ключ, однако ему ещё нужно установить, кому этот ключ принадлежит. Схема HMAC определена в RFC 2104.

Локальная проверка без секретных данных

Пример для Python 3.7+ использует только стандартную библиотеку и синтетические данные; ожидаемый вывод проверен на Python 3.14.5:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
import base64
import hashlib
import hmac

message = b"ctf"
encoded = base64.b64encode(message)
print(encoded.decode("ascii"))
print(base64.b64decode(encoded) == message)
print(len(hashlib.sha256(message).digest()))

key = b"DEMO-ONLY-KEY"
tag = hmac.digest(key, message, "sha256")
print(hmac.compare_digest(tag, hmac.digest(key, message, "sha256")))
print(hmac.compare_digest(tag, hmac.digest(key, b"ctf!", "sha256")))

Ожидаемый вывод:

1
2
3
4
5
Y3Rm
True
32
True
False

32 байта соответствуют 256 битам. Последняя строка показывает несовпадение тегов для конкретного изменённого сообщения. Демонстрационный ключ опубликован вместе с кодом и не подходит для защиты данных. Опыт не доказывает криптографическую стойкость алгоритма: он проверяет понимание интерфейсов и результата.

Дальше изучите модели криптографических атак: они объясняют, какие возможности предполагаются у противника. Затем переходите к криптографии сетевых протоколов, где шифрование, согласование ключей и аутентификация работают совместно.

Licensed under CC BY-NC-SA 4.0
Обновлено нояб. 13, 2026 00:00 MSK
Создано при помощи Hugo
Тема Stack, дизайн Jimmy