Российский стандарт шифрования ГОСТ 28147-89 является более современным, чем DES и значительно более стойким, чем даже 3-DES и AES за счет применения более длинного ключа 256 бит и использования при шифровании блоков 32-х проходов (для ускорения преобразования некоторые авторы также предлагают использовать сокращенную версию на основе 64-бит ключа и 8 проходов).
Как и в случае с DES, стандартом предусмотрены четыре режима:
1. Простое шифрование – базовая версия алгоритма, когда каждый блок из 64 бит открытого текста независимо преобразуется в блок 64 бита шифртекста.
2. Гаммирование с обратной связью – режим сцепления блоков, когда очередной блок шифртекста получается путем побитного сложения по модулю 2 открытого текста и предыдущего блока, преобразованного по алгоритму простого шифрования (см. п.1). Для сложения с самым первым блоком используется зашифрованная специальная начальная комбинация, называемая имитовектором. Этим, как уже говорилось, достигается общая связанность всего шифруемого текста, усиливающая стойкость алгоритма. Данная модификация используется наиболее часто.
3. Гаммирование – также представляет собой режим сцепления блоков, только инициирующий вектор создается из самого открытого текста. Этот режим используется в основном для генерации псевдо случайных чисел (последовательностей).
4. Выработка имитовставки – фактически представляет собой режим гаммирования с обратной связью. Однако во время преобразований используется сокращенное число проходов (16 вместо 32 двух, см. ниже). В качестве результата работы в данном режиме рассматривают итог шифрования последнего блока из 64 бит, который служит криптографической хэш-функцией от открытого текста с ключом и в терминах стандарта называется имитовставкой, применяемой для контроля целостности и аутентификации открытого текста (т.е. ЭЦП).
Процесс работы алгоритма в случае простого шифрования одного блока 64 бит выглядит следующим образом:
1. Ключевая комбинация из 256 бит делится на 8 частей по 32 бита:
KEY = k0k1k2k3k4k5k6k7
Если алгоритм применяется для шифрования блока в режиме простого шифрования, гаммирования с обратной связью или просто гаммирования, данный ключ преобразуется в расширенную последовательность из n = 32 частей по 32 бита:
Если же применяется режим выработки имитовставки, то ключ преобразуется в расширенную последовательность меньшей длины из n = 16 частей по 32 бита:
KEY' = = k0k1k2k3k4k5k6k7k0k1k2k3k4k5k6k7k0
2. Очередной блок открытого текста из 64 бит разделяется на две части по 32 бита: T = AB.
3. Внутри каждой из частей A и B происходит перестановка бит в обратном порядке, т.е. 1-й бит становится 32-м, 2-й бит становится 31-м и т.д. Таким образом, в вычислительных системах с архитектурой x86 восстанавливается "естественная" последовательность бит от младших к старшим "слева-направо" (в то время как в компьютерах следование бит от младшего к старшему идет справа-налево). В результате получаются комбинации A0 и B0.
4. Происходит n преобразований (32 или 16) в соответствии с правилами:
для i = 1 ... n:
Ai = f(Ai–1 Å ) xor Bi–1;
Bi = Ai–1;
Здесь Å – сложение по модулю 232, т.е. при переполнении слова в 32 бита, соответствующий разряд просто игнорируется.
5. Последние по счету комбинации меняются местами:
A32 = A31;
B32 = f(A31 Å k0) xor B31.
А затем происходит их обратная перестановка, т.е. их 1-е биты становятся 32-ми, 2-е биты становятся 31-ми и т.д. В результате получаются комбинации Aш и Bш.
6. Блок шифртекста является комбинацией AшBш.
Как и в случае с алгоритмом DES основная нагрузка при шифровании возложена на функцию шифрования f, которая, однако, в данном случае намного более проще и, соответственно, быстрее. Суть ее работы заключается в следующем:
1. На вход функции поступает комбинация из 32-х бит. Она разделяется на 8 частей по 4 бита:
B = B1B2B3B4B5B6B7B8
2. Для каждой комбинации Bi существует специальный вектор Si, состоящий из 16-ти элементов, пронумерованных, начиная с нуля. Каждый элемент представляет собой число от 0 до 15 (т.е. в двоичном виде 4 бита). На основе этих векторов каждая комбинация Bi заменяется на комбинацию B'i, являющуюся каким-либо элементом вектора Si. Элемент выбирается по следующему правилу: номер элемента равен значению Bi.
Например, B7 = 1100. Значит комбинация B'7 будет равна 12-му элементу вектора S7.
3. В результате получается комбинация из 32-х бит:
B' = B'1B'2B'3B'4B'5B'6B'7B'8
4. Комбинация B' циклически сдвигается влево на 11 разрядов, в результате чего и появляется 32-битное значение функции шифрования.
Таким образом, как и в DES, используется 8 специальных структур преобразования. Однако в российском стандарте они компактнее, и их содержание не оговаривается. Говорится только, что взаимодействующие стороны должны иметь одинаковые S-вектора и должны хранить их в секрете.