Перейти к содержимому

Криптография ГОСТ простыми словами: хэши, подписи, шифрование и сертификаты

Криптография ГОСТ простыми словами: хэши, подписи, шифрование и сертификаты

Рано или поздно российскому разработчику приходится работать с электронной подписью, сертификатами или программами класса "КриптоПро". После первых поисков легко столкнуться с длинным списком терминов: СКЗИ, ГОСТ Р 34.10, "Стрибог", "Кузнечик", PKCS#7, PKCS#11, CAdES-BES, X.509, отсоединённая подпись и другие.

Проблема в том, что эти понятия относятся к разным уровням одной системы. Одни алгоритмы вычисляют отпечаток файла, другие подтверждают авторство, третьи скрывают содержимое, а стандарты PKCS и X.509 описывают способы хранения ключей, сертификатов и готовых подписей.

Три главные задачи криптографии

Практически любую защищённую систему удобно рассматривать через три базовых механизма: хэширование, электронную подпись и шифрование. У каждого из них собственное назначение.

Хэширование: цифровой отпечаток документа

Хэш-функция принимает данные любого размера и преобразует их в короткую последовательность фиксированной длины. Например, большой договор, архив или файл размером 50 МБ превращается в значение длиной 256 или 512 бит.

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

Главное свойство хэша - чувствительность к изменениям. Если в документе заменить один символ или добавить всего одну запятую, результат вычисления изменится полностью. Поэтому получатель может сравнить хэш исходного и полученного файла и понять, не было ли содержимое изменено.

В российском наборе стандартов для этой задачи применяется ГОСТ Р 34.11-2012, известный как "Стрибог". Он предусматривает варианты с длиной результата 256 и 512 бит.

Электронная подпись: кто подписал и что именно подписали

Электронная подпись отвечает на два вопроса: кто создал подпись и сохранился ли документ в первоначальном виде.

В основе используется асимметричная криптография с парой ключей:

- закрытый ключ хранится у владельца и применяется для создания подписи;
- открытый ключ распространяется вместе с сертификатом и используется для проверки.

Закрытый ключ обычно находится на защищённом токене, смарт-карте или другом устройстве, доступ к которому защищён PIN-кодом. Открытый ключ сам по себе не является секретом: его должны получить все участники, которым необходимо проверять подпись.

На практике подписывается не весь большой файл напрямую, а его хэш. Алгоритм электронной подписи преобразует этот отпечаток с помощью закрытого ключа в цифровую последовательность. Проверяющая сторона заново вычисляет хэш документа и сопоставляет его с данными подписи.

В российской криптографии для электронной подписи используется ГОСТ Р 34.10-2012. Стандарт основан на криптографии эллиптических кривых и предусматривает ключи длиной 256 или 512 бит.

Шифрование: защита содержимого

Подпись подтверждает подлинность документа, но не скрывает его текст. Если необходимо сделать данные недоступными для посторонних, применяется шифрование.

Симметричный алгоритм использует один секретный ключ: им данные зашифровываются и им же расшифровываются. Главная сложность такой схемы - безопасно передать ключ второй стороне.

К российским симметричным алгоритмам относятся ГОСТ 34.12-2015 "Магма" и "Кузнечик". "Магма" связана с развитием ГОСТ 28147-89, а "Кузнечик" представляет собой более новую конструкцию.

Важно не путать подпись и шифрование. Подписанный файл может оставаться полностью читаемым, а зашифрованный документ не обязательно подтверждает личность отправителя.

Как развивались отечественные стандарты

Криптографические алгоритмы периодически пересматриваются: растёт вычислительная мощность компьютеров, обнаруживаются слабые места, совершенствуются методы атак. Поэтому старые стандарты постепенно выводятся из эксплуатации.

Первое поколение

В 1990-е годы применялись:

- ГОСТ Р 34.10-94 для электронной подписи;
- ГОСТ Р 34.11-94 для хэширования;
- ГОСТ 28147-89 для симметричного шифрования.

Сегодня этот набор считается устаревшим.

Второе поколение

В 2000-е появился ГОСТ Р 34.10-2001, построенный на эллиптических кривых. Для хэширования при этом продолжал использоваться ГОСТ Р 34.11-94.

Выпуск сертификатов на базе ГОСТ Р 34.10-2001 официально прекратили в 2019 году, поэтому в новых системах ориентироваться на него не следует.

Современный набор

Актуальное поколение включает:

- ГОСТ Р 34.10-2012 - электронная подпись;
- ГОСТ Р 34.11-2012 - хэширование, "Стрибог";
- ГОСТ Р 34.12-2015 - симметричное шифрование "Магма" и "Кузнечик".

Именно эти названия чаще всего встречаются в современных сертификатах, криптопровайдерах и технических требованиях.

Чем ГОСТ отличается от зарубежных алгоритмов

Логика российской криптографии не уникальна. Западные системы решают те же задачи с помощью других стандартов:

- SHA-256 и SHA-512 выполняют роль хэш-функций;
- RSA и ECDSA применяются для электронной подписи;
- AES используется для симметричного шифрования;
- TLS защищает сетевое соединение;
- сертификаты описываются стандартом X.509.

Различие заключается не в самих задачах, а в конкретных математических алгоритмах, форматах данных, правилах сертификации и требованиях регуляторов.

Что такое PKCS и X.509

PKCS - семейство стандартов, описывающих форматы криптографических объектов. Они помогают разным программам одинаково понимать ключи, сертификаты и подписи.

PKCS#11: доступ к токену

PKCS#11 - программный интерфейс для работы с криптографическим оборудованием. Через него приложение может обращаться к токену, находить сертификаты, использовать закрытый ключ и создавать подпись, не извлекая секретный ключ наружу.

Это особенно важно с точки зрения безопасности: закрытый ключ может навсегда оставаться внутри защищённого устройства.

PKCS#12: контейнер с ключом и сертификатом

PKCS#12 используется для хранения закрытого ключа, сертификата и связанных данных в одном контейнере. Файлы такого типа часто имеют расширение `.pfx` или `.p12` и защищаются паролем.

Такой контейнер нужно считать секретным: он может содержать закрытый ключ. Передача его по незащищённым каналам или хранение без пароля создаёт серьёзный риск.

PKCS#10: запрос на сертификат

PKCS#10 описывает запрос на выпуск сертификата. В нём указывается открытый ключ и сведения о владельце, а сам запрос подписывается соответствующим закрытым ключом.

Центр сертификации проверяет заявку и после необходимых процедур выпускает сертификат.

X.509: цифровой паспорт открытого ключа

Сертификат X.509 связывает открытый ключ с его владельцем. В нём содержатся имя субъекта, открытый ключ, срок действия, данные центра сертификации, идентификаторы алгоритмов и электронная подпись самого удостоверяющего центра.

Файлы сертификатов часто имеют расширения `.cer` или `.crt`. Однако расширение не гарантирует конкретный формат хранения: сертификат может быть представлен в бинарном виде DER или в текстовом формате PEM.

Проверять нужно не только срок действия сертификата, но и цепочку доверия, назначение ключа, соответствие алгоритма и наличие отзыва.

Форматы готовых подписей

После создания подписи нужно определить, как упаковать её вместе с документом.

PKCS#7 и CMS

PKCS#7, а в более современном варианте CMS, служит универсальным контейнером для подписей и сертификатов. Он может содержать сам документ или только подпись, связанную с внешним файлом.

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

CAdES

CAdES развивает CMS и добавляет профили, необходимые для долговременного использования электронной подписи. Например, можно включить сведения о времени подписания, сертификатах, ответах служб проверки статуса и доказательствах, позволяющих проверять подпись спустя годы.

Обозначение CAdES-BES обычно означает базовую подпись с минимальным набором дополнительных данных. Более сложные профили предназначены для долгосрочного хранения и усиленной проверки.

XAdES и PAdES

XAdES применяется для подписания XML-документов. Такой формат удобен в интеграциях между информационными системами, где данные уже представлены в XML.

PAdES предназначен для PDF. Подпись может быть встроена внутрь самого PDF-файла, а отображение информации о подписанте - добавлено на страницу документа.

Выбор формата зависит не от личных предпочтений разработчика, а от требований информационной системы, формата исходного файла и нормативных правил.

Что учитывать при проектировании

Перед реализацией подписи нужно определить несколько вещей:

1. Какой алгоритм требуется: ГОСТ 2012, старый стандарт или другой профиль.
2. Где будет храниться закрытый ключ: токен, файловый контейнер, HSM или иной носитель.
3. Нужна ли отсоединённая подпись.
4. Должен ли подписанный контейнер включать сертификат.
5. Требуется ли долгосрочная проверка подписи.
6. Кто и как будет проверять цепочку доверия.
7. Нужно ли шифровать данные помимо их подписания.
8. Как будет обрабатываться отзыв сертификата и окончание его срока действия.

Отдельное внимание следует уделить кодировкам, каноникализации XML, формату бинарных данных и обработке ошибок. Даже корректный криптографический алгоритм не спасёт систему, если разные участники по-разному сериализуют один и тот же документ.

Итоговая схема

Упрощённый процесс выглядит так:

1. Система получает исходный документ.
2. Вычисляет его хэш с помощью подходящей функции.
3. Создаёт подпись закрытым ключом.
4. Формирует контейнер PKCS#7/CMS, CAdES, XAdES или PAdES.
5. При необходимости добавляет сертификат и данные проверки.
6. Передаёт результат получателю.
7. Получатель проверяет сертификат, подпись и соответствие документа исходному хэшу.

Главное правило - не смешивать уровни. "Стрибог" не подписывает документы, ГОСТ Р 34.10-2012 не шифрует файлы, сертификат X.509 не заменяет закрытый ключ, а PKCS#7 не является самостоятельным алгоритмом. Когда роли каждого элемента разделены, работа с российской криптографией перестаёт выглядеть набором загадочных аббревиатур и превращается в понятную инженерную задачу.

Прокрутить вверх