STRUMOK

Эта статья находится на начальном уровне проработки, в одной из её версий выборочно используется текст из источника, распространяемого под свободной лицензией
Материал из энциклопедии Руниверсалис
СТРУМОК
Создатель Olexandr Kuznetsov, Mariya Lutsenko, Dmytro Ivanenko, ПАТ «Інститут інформаційних технологій»
Создан 2016
Стандарты ДСТУ 8845:2019
Размер ключа 256, 512 бит
Тип Потоковый шифр

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

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

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

Схема работы

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

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

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

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

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

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

Алгоритм

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

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

Функция инициализации [math]\displaystyle{ Init }[/math]

Вход : 256 или 512-битный ключ [math]\displaystyle{ K }[/math], 256-битный вектор инициализации [math]\displaystyle{ IV }[/math].

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

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

Функция следующего состояния [math]\displaystyle{ Next }[/math]

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

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

  1. Обновляются значения регистров конечного автомата [math]\displaystyle{ r_{i+1} }[/math] .
  2. Обновляется значение 15 ячеек регистра сдвига: [math]\displaystyle{ s^{(i+1)}_j = s^{(i)}_{j+1}, j = 0, 1, ..., 14. }[/math]
  3. Обновляется значение 16 ячейки: [math]\displaystyle{ s_{15}^{(i+1)} = (s_{0}^{(i)}\bigotimes\alpha)\bigoplus(s_{11}^{(i)}\bigotimes\alpha^{-1}) \bigoplus s_{13}^{(i)} }[/math] при работе в обычном режиме и [math]\displaystyle{ 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] при режиме инициализации.
  4. Выводится значение [math]\displaystyle{ S_{i+1} = (s^{(i+1)}, r^{(i+1)}) }[/math].

Функция ключевого потока [math]\displaystyle{ Strm }[/math]

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

Выход: ключевой поток [math]\displaystyle{ Z_i }[/math].

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

Функция конечного автомата [math]\displaystyle{ FSM }[/math] используется в функциях [math]\displaystyle{ Strm }[/math] и [math]\displaystyle{ Next }[/math].

Вход : три 64-битных строки [math]\displaystyle{ x_1, x_2, x_3 }[/math].

Выход : 64-битная строка [math]\displaystyle{ x }[/math].

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

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

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

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

[math]\displaystyle{ f (x) = x^{16} + x^{13} +\alpha^{-1} x^{11} + \alpha, }[/math]

где [math]\displaystyle{ \alpha }[/math] является корнем многочлена над полем [math]\displaystyle{ GF(2^8) }[/math]:

[math]\displaystyle{ 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]\displaystyle{ \beta }[/math] является корнем многочлена над полем [math]\displaystyle{ GF(2) }[/math]:

[math]\displaystyle{ p(x) = x^{8} + x^{4} + x^{3} + x^{2} + 1 }[/math] .

Поле [math]\displaystyle{ GF(2^8) }[/math] строится над полем [math]\displaystyle{ GF(2) }[/math] полиномом [math]\displaystyle{ p(x) }[/math].

Период выходной последовательности регистра сдвига является максимальным и равным [math]\displaystyle{ 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]

Примечания

  1. ДСТУ 8845:2019 Информационные технологии. Криптографическая защита информации. Алгоритм симметричного поточного преобразования.
  2. Olexandr Kuznetsov, Mariya Lutsenko, Dmytro Ivanenko. Strumok Stream Cipher: Spesification and Basic Properties // Department Information and communication systems security, V. N. Karazin Kharkiv National University, Kharkiv, Ukraine.
  3. О.О. КУЗНЕЦОВ, І.Д. ГОРБЕНКО, Ю.І. ГОРБЕНКО, А.М. ОЛЕКСІЙЧУК. МАТЕМАТИЧНА СТРУКТУРА ПОТОКОВОГО ШИФРУ СТРУМОК (укр.) // Харківський національний університет імені В.Н. Каразіна. — 2018.
  4. Oleksii Nariezhnii, Egor Eremin, Vladislav Frolenko, Kyrylo Chernov, Tetiana Kuznetsova, Yevhen Demenko. STATISTICAL PROPERTIES OF MODERN STREAM CIPHERS // V. N. Karazin Kharkiv National University. — ISSN 2519-2310. Архивировано 14 июля 2020 года.
  5. Ivan Gorbenko, Yurii Gorbenko, Vladyslav Tymchenko, Olena Kachko. TESTING THE SPEED OF MODERN STREAM CIPHERS // Kharkiv national university of Radio Electronics. — 2018. — ISSN 2519-2310.