S-блоки ГОСТ 28147-89
S-блоки ГОСТ 28147-89 — это нелинейные узлы замены (подстановки), используемые в алгоритме симметричного блочного шифрования ГОСТ 28147-89 (стандарт СССР и России). Они представляют собой таблицы фиксированной размерности, задающие отображение входного 4-битного значения на выходное 4-битное значение. S-блоки являются единственным нелинейным компонентом шифра, обеспечивающим его криптостойкость, и их конкретное содержимое не регламентируется стандартом жёстко, а определяется для каждой реализации отдельно.
Определение и роль в алгоритме
ГОСТ 28147-89 является шифром Фейстеля с длиной блока 64 бита и длиной ключа 256 бит. Основное криптографическое преобразование — это 32 раунда, в каждом из которых выполняется операция замены (S-блоки) и циклического сдвига.
Процедура замены в раунде выглядит следующим образом:
- 64-битный блок данных делится на левую (L) и правую (R) половины по 32 бита.
- К правой половине (R) по модулю 2³² прибавляется раундовый ключ (Kᵢ).
- Результат разбивается на 8 групп по 4 бита (от младшего к старшему).
- Каждая 4-битная группа заменяется значением из соответствующего S-блока (S₁, S₂, …, S₈). Каждый S-блок представляет собой таблицу из 16 значений (от 0 до 15), расположенных в определённом порядке.
- Полученные 8 четырёхбитных результатов объединяются в 32-битное число, которое затем циклически сдвигается влево на 11 бит.
- Результат сдвига складывается по модулю 2 (XOR) с левой половиной (L), после чего половины меняются местами.
Таким образом, S-блоки выполняют единственное нелинейное преобразование в шифре, делая его устойчивым к линейному и дифференциальному криптоанализу.
Структура и размерность
Каждый S-блок (узел замены) представляет собой таблицу из 16 элементов, каждый из которых является 4-битным числом (от 0 до 15). Входное 4-битное значение (от 0 до 15) является индексом в таблице, а выходное — соответствующим значением.
Например, если S-блок задан последовательностью чисел: 4, 10, 9, 2, 13, 8, 0, 14, 6, 11, 1, 12, 7, 15, 5, 3, то:
- Входное значение 0 заменяется на 4.
- Входное значение 1 заменяется на 10.
- Входное значение 15 заменяется на 3.
Всего в алгоритме используется 8 таких S-блоков (S₁…S₈), каждый из которых отвечает за свой диапазон битов в 32-битном блоке после сложения с ключом.
История и стандартизация
ГОСТ 28147-89 был введён в действие 1 июля 1990 года как стандарт шифрования для защиты государственных и ведомственных информационных систем. В отличие от многих зарубежных стандартов (например, DES с фиксированными S-блоками), разработчики ГОСТа сознательно оставили содержимое S-блоков неопределённым, полагая, что это может быть дополнительным секретным элементом, усиливающим защиту.
В первоначальной редакции стандарта (ГОСТ 28147-89) S-блоки не публиковались. Для государственных нужд они задавались специальными нормативными документами (НД), которые имели гриф секретности. Для гражданских систем (например, в банковских приложениях) S-блоки могли выбираться произвольно, но с соблюдением определённых криптографических требований.
В 1996 году Центральный банк России опубликовал рекомендации (Положение № 1-Т), в которых для банковских систем были определены конкретные S-блоки, известные как «S-блоки ЦБ РФ» или «криптографические подстановки ЦБ РФ». Эти блоки стали де-факто стандартом для коммерческого использования.
Виды и варианты S-блоков
Поскольку стандарт не фиксирует S-блоки жёстко, существует несколько распространённых наборов:
1. S-блоки ЦБ РФ (1996)
Наиболее распространённый вариант, рекомендованный для банковских систем. Их содержимое было опубликовано в открытой печати. Эти блоки считаются криптостойкими и прошли проверку на отсутствие статистических аномалий.
2. S-блоки из проекта «Сибирь»
Набор, использовавшийся в некоторых ранних реализациях для государственных нужд. Его криптостойкость оценивается как достаточная, но он менее распространён.
3. S-блоки для тестирования
Для отладки и тестирования алгоритмов часто используется «единичная» подстановка, когда каждый S-блок является тождественным отображением (0→0, 1→1, …, 15→15). Такие блоки не обеспечивают криптостойкости и применяются только в учебных целях.
4. Произвольные S-блоки
Любой разработчик может задать свои S-блоки, если они удовлетворяют общим требованиям (взаимная однозначность, отсутствие фиксированных точек и т.д.). Однако при неправильном выборе стойкость шифра может снизиться.
Криптографические требования
Для обеспечения стойкости шифра S-блоки должны удовлетворять ряду свойств:
- Взаимная однозначность (биективность): каждое выходное значение должно встречаться ровно один раз в таблице.
- Отсутствие фиксированных точек: желательно, чтобы ни один S-блок не имел входного значения, равного выходному (S[i] ≠ i для всех i).
- Отсутствие обратных фиксированных точек: S[i] ≠ 15-i.
- Лавинный эффект: изменение одного бита на входе должно приводить к изменению как минимум двух бит на выходе.
- Нелинейность: S-блоки должны быть максимально нелинейными, чтобы затруднить линейный криптоанализ.
Критика и особенности
Секретность S-блоков
Возможность выбора S-блоков долгое время рассматривалась как преимущество, позволяющее вводить дополнительный секретный элемент (так называемый «ключ замены»). Однако с развитием криптоанализа выяснилось, что слабые S-блоки могут полностью скомпрометировать шифр, а сильные — быть известны. В современных стандартах (например, AES) S-блоки фиксированы и открыты, чтобы гарантировать единый уровень стойкости.
Сравнение с DES
S-блоки ГОСТа имеют размерность 4×4 бита, в то время как в DES используются блоки 6×4 бита. Это делает ГОСТ более компактным и быстрым в программной реализации, но потенциально менее стойким к дифференциальному криптоанализу при неудачном выборе блоков.
Замена в новых стандартах
В 2015 году в России был принят новый стандарт шифрования ГОСТ Р 34.12-2015 («Кузнечик» и «Магма»). Алгоритм «Магма» является модернизированной версией ГОСТ 28147-89, но в нём S-блоки уже жёстко фиксированы и определены в стандарте. При этом старый ГОСТ 28147-89 остаётся разрешённым для использования, но его реализациям рекомендуется применять S-блоки ЦБ РФ.
Применение
S-блоки ГОСТ 28147-89 используются во всех реализациях этого шифра:
- В криптопровайдерах (например, Microsoft CryptoAPI, OpenSSL через дополнения).
- В российских стандартах электронной подписи (ГОСТ Р 34.10-2012) для хеширования.
- В системах защиты банковских транзакций (протоколы SWIFT, банковские терминалы).
- В государственных информационных системах (ЕГАИС, ГАС «Выборы» и др.).
Источники
- ГОСТ 28147-89 «Системы обработки информации. Защита криптографическая. Алгоритм криптографического преобразования».
- Положение Центрального банка РФ № 1-Т от 1996 года «О криптографических подстановках».
- Шнайер Б. «Прикладная криптография» (глава 14.4 — ГОСТ 28147-89).
- Рябко Б.Я., Фионов А.Н. «Криптографические методы защиты информации» (раздел 6.3).
- ГОСТ Р 34.12-2015 «Информационная технология. Криптографическая защита информации. Блочные шифры».
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →