Русская Википедия: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-битных блоков:
- 16 ячеек регистра сдвига с линейным обратной связью : <math>s_i = (s^{(i)}_{15}, s^{(i)}_{14}, ..., s^{(i)}_0)</math> ;
- два регистра конечного автомата <math>r_i = (r^{(i)}_1, r^{(i)}_0)</math> .
Выход представляет собой ключевой поток (гамму), который формируется из 64-битных слов <math>Z_i</math>.
Алгоритм
В алгоритме СТРУМОК можно выделить три основные функции:
- функция инициализации <math>Init</math>, которая принимает в качестве входных данных ключ <math>K</math> и вектор инициализации <math>IV</math> , и производит начальное значение переменной состояния <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>;
- функция ключевого потока <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>.
- В 16 ячеек регистра сдвига заносится значения, сформированные на основании ключа и вектора инициализации. Таким образом формируется <math>S_{-33} = (s^{(-33)}, r^{(-33)}</math>.
- Выполняются 32 инициирующих такта без генерации ключевого потока(выполнение функции Next в режиме инициализации INIT ): <math>S_{-1} = Next^{32}(S_{-33}, INIT</math>.
- Рассчитывается начальное значение переменной состояния: <math>S_0 = Next(S_{-1})</math>.
- Выводится значение <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>.
- Обновляются значения регистров конечного автомата <math>r_{i+1}</math> .
- Обновляется значение 15 ячеек регистра сдвига: <math>s^{(i+1)}_j = s^{(i)}_{j+1}, j = 0, 1, ..., 14.</math>
- Обновляется значение 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> при режиме инициализации.
- Выводится значение <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>.
- Вычисляется значение <math>Z_{i} = FSM(s_{15}^{(i)}, r_{1}^{(i)}, r_{2}^{(i)})\bigoplus s_{0}^{(i)}</math> .
- Выводится значение <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>.
- Вычисляется значение <math>x = (x_1 +_{64} x_2) \bigoplus x_3</math> .
- Выводится значение <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]
Примечания
Шаблон:Симметричные криптоалгоритмы