Русская Википедия:STRUMOK

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску

Шаблон:Блочный шифр «СТРУМОК» (Шаблон:Lang-en; рус. Ручей; поток; струя) — потоковый симметричный шифр, описанный в национальном стандарте Украины ДСТУ 8845:2019 «Информационные технологии. Криптографическая защита информации. Алгоритм симметричного поточного преобразования»[1]. Стандарт вступил в силу с 1 октября 2019.

В зависимости от длинны секретного ключе имеет два режима работы: «СТРУМОК-256» и «СТРУМОК-512».

СТРУМОК обеспечивает высокую скорость формирования ключевого потока (более 10 Гбит/c).

Схема работы

Схема работы шифра СТРУМОК
Формирование ключевого потока в шифре СТРУМОК

Общая схема работы

В основе алгоритма СТРУМОК лежит идея гаммирования, заключающаяся в «наложении» последовательности, состоящей из случайных чисел, на открытый текст. Генератор псевдослучайных чисел СТРУМОК использует 256-битный вектор инициализации <math>IV</math> и 256-битный или 512-битный секретный ключ <math>K</math> и обеспечивает стойкость с учётом возможного применения квантового криптографического анализа. Криптоалгоритм ориентирован на 64-разрядные вычислительные системы, следовательно размер слова определён равным 64 битам.

Основными структурными компонентами генератора является регистр сдвига с линейным обратной связью и конечный автомат, в котором выполняется нелинейное преобразование. Входные данные (ключ <math>K </math> и вектор инициализации <math>IV</math>) используются для инициализации переменной состояния <math>S_i (i >=0)</math>, которая состоит из восемнадцати 64-битных блоков:

  1. 16 ячеек регистра сдвига с линейным обратной связью : <math>s_i = (s^{(i)}_{15}, s^{(i)}_{14}, ..., s^{(i)}_0)</math> ;
  2. два регистра конечного автомата <math>r_i = (r^{(i)}_1, r^{(i)}_0)</math> .

Выход представляет собой ключевой поток (гамму), который формируется из 64-битных слов <math>Z_i</math>.

Алгоритм

В алгоритме СТРУМОК можно выделить три основные функции:

  1. функция инициализации <math>Init</math>, которая принимает в качестве входных данных ключ <math>K</math> и вектор инициализации <math>IV</math> , и производит начальное значение переменной состояния <math>S_0 = (s^{(0)}, r^{(0)})</math>;
  2. функция следующего состояния <math>Next</math>, которая принимает на вход переменную состояния <math>S_i = (s^{(i)}, r^{(i)})</math> и производит следующее значение переменной состояния <math>S_{i+1} = (s^{(i+1)}, r^{(i+1)})</math>;
  3. функция ключевого потока <math>Strm</math>, что принимает на входе переменную состояния <math>S_i = (s^{(i)}, r^{(i)})</math> и производит на выходе ключевой поток <math>Z_i</math>(64 бита).

Функция инициализации <math>Init</math>

Вход : 256 или 512-битный ключ <math>K</math>, 256-битный вектор инициализации <math>IV</math>.

Выход : начальное значение переменной состояния <math>S_0 = (s^{(0)}, r^{(0)})</math>.

  1. В 16 ячеек регистра сдвига заносится значения, сформированные на основании ключа и вектора инициализации. Таким образом формируется <math>S_{-33} = (s^{(-33)}, r^{(-33)}</math>.
  2. Выполняются 32 инициирующих такта без генерации ключевого потока(выполнение функции Next в режиме инициализации INIT ): <math>S_{-1} = Next^{32}(S_{-33}, INIT</math>.
  3. Рассчитывается начальное значение переменной состояния: <math>S_0 = Next(S_{-1})</math>.
  4. Выводится значение <math>S_0 = (s^{(0)}, r^{(0)})</math>.

Функция следующего состояния <math>Next</math>

Вход: Переменная состояния <math>S_i = (s^{(i)}, r^{(i)})</math> и режим работы(обычный или режим инициализации).

Выход: Переменная состояния <math>S_{i+1} = (s^{(i+1)}, r^{(i+1)})</math>.

  1. Обновляются значения регистров конечного автомата <math>r_{i+1}</math> .
  2. Обновляется значение 15 ячеек регистра сдвига: <math>s^{(i+1)}_j = s^{(i)}_{j+1}, j = 0, 1, ..., 14.</math>
  3. Обновляется значение 16 ячейки: <math>s_{15}^{(i+1)} = (s_{0}^{(i)}\bigotimes\alpha)\bigoplus(s_{11}^{(i)}\bigotimes\alpha^{-1})

\bigoplus s_{13}^{(i)}</math> при работе в обычном режиме и <math>s_{15}^{(i+1)} = FSM(s_{15}^{(i)}, r_{1}^{(i)}, r_{2}^{(i)})\bigoplus(s_{0}^{(i)}\bigotimes\alpha)\bigoplus(s_{11}^{(i)}\bigotimes\alpha^{-1})

\bigoplus s_{13}^{(i)}</math> при режиме инициализации.

  1. Выводится значение <math>S_{i+1} = (s^{(i+1)}, r^{(i+1)})</math>.

Функция ключевого потока <math>Strm</math>

Вход: Переменная состояния <math>S_i = (s^{(i)}, r^{(i)})</math>.

Выход: ключевой поток <math>Z_i</math>.

  1. Вычисляется значение <math>Z_{i} = FSM(s_{15}^{(i)}, r_{1}^{(i)}, r_{2}^{(i)})\bigoplus s_{0}^{(i)}</math> .
  2. Выводится значение <math>Z_i</math> .
Функция конечного автомата <math>FSM</math>

Функция конечного автомата <math>FSM</math> используется в функциях <math>Strm</math> и <math>Next</math>.

Вход : три 64-битных строки <math>x_1, x_2, x_3</math>.

Выход : 64-битная строка <math>x</math>.

  1. Вычисляется значение <math>x = (x_1 +_{64} x_2) \bigoplus x_3</math> .
  2. Выводится значение <math>x</math> .
  • <math>+_{64}</math> обозначает операцию сложения целых чисел по модулю 264 .

Схема работы регистра сдвига

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

Обратная связь в регистре сдвига строится над полем <math>GF(2^{64})</math> полиномом:

<math> f (x) = x^{16} + x^{13} +\alpha^{-1} x^{11} + \alpha, </math>

где <math>\alpha</math> является корнем многочлена над полем <math>GF(2^8)</math>:

<math> g(x) = x^{8} + \beta^{170} x^{7} + \beta^{166} x^{6} + \beta^{2} x^{5} + \beta^{224} x^{4} + \beta^{70} x^{3} + \beta^{2} </math> ,

где <math>\beta</math> является корнем многочлена над полем <math>GF(2)</math>:

<math> p(x) = x^{8} + x^{4} + x^{3} + x^{2} + 1 </math> .

Поле <math>GF(2^8)</math> строится над полем <math>GF(2)</math> полиномом <math>p(x)</math>.

Период выходной последовательности регистра сдвига является максимальным и равным <math>2^{1024} - 1</math>.

Сравнение со SNOW 2.0

Генератор ключевого потока СТРУМОК в своей концептуальной схеме подобен SNOW 2.0. Но SNOW 2.0 ориентирован на использование в 32-разрядных вычислительных систем, тогда как СТРУМОК предназначен для использования в более мощных 64-разрядных вычислительных системах. В связи с этим в алгоритме Струмок повышается скорость формирования псевдослучайной последовательности.[2] В алгоритме СТРУМОК увеличены, по сравнению с SNOW2.0, длины секретного ключа и вектора инициализации. Это позволяет надежно применять поточный шифр даже в условиях, когда злоумышленнику доступно применение квантового криптоанализа.[3]

Тестирование направленное на определение случайности двоичных последовательностей NIST показывает, что алгоритм СТРУМОК уступает SNOW 2.0.[4]

Генератор ключевых потоков СТРУМОК позволяет формировать псевдослучайные последовательности со скоростью более 10 Гбит/с(Intel Core i9-7980XE 2.60 GHz and OS Windows® 10 Pro).[5]

Примечания

Шаблон:Примечания

Шаблон:Симметричные криптоалгоритмы