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