Криптография помогает скрывать содержимое, обнаруживать подмену и подтверждать происхождение данных. Это несколько разных задач. Для начала полезнее научиться выбирать нужное свойство, чем запоминать длинный список алгоритмов.
В 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:
| |
Ожидаемый вывод:
| |
32 байта соответствуют 256 битам. Последняя строка показывает несовпадение тегов для конкретного изменённого сообщения. Демонстрационный ключ опубликован вместе с кодом и не подходит для защиты данных. Опыт не доказывает криптографическую стойкость алгоритма: он проверяет понимание интерфейсов и результата.
Дальше изучите модели криптографических атак: они объясняют, какие возможности предполагаются у противника. Затем переходите к криптографии сетевых протоколов, где шифрование, согласование ключей и аутентификация работают совместно.