STRUMOK

26-04-2021, 13:57

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

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

Схема работы

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

В основе алгоритма Струмок лежит идея гаммирования, заключающаяся в «наложении» последовательности, состоящей из случайных чисел, на открытый текст. Генератор псевдослучайных чисел Струмок использует 256-битный вектор инициализации I V {displaystyle IV} и 256-битный или 512-битный секретный ключ K {displaystyle K} и обеспечивает стойкость с учётом возможного применения квантового криптографического анализа. Криптоалгоритм ориентирован на 64-разрядные вычислительные системы, следовательно размер слова определён равным 64 битам.

Основными структурными компонентами генератора является регистр сдвига с линейным обратной связью и конечный автомат, в котором выполняется нелинейное преобразование. Входные данные (ключ K {displaystyle K} и вектор инициализации I V {displaystyle IV} ) используются для инициализации переменной состояния S i ( i >= 0 ) {displaystyle S_{i}(i>=0)} , которая состоит из восемнадцати 64-битных блоков:

  • 16 ячеек регистра сдвига с линейным обратной связью : s i = ( s 15 ( i ) , s 14 ( i ) , . . . , s 0 ( i ) ) {displaystyle s_{i}=(s_{15}^{(i)},s_{14}^{(i)},...,s_{0}^{(i)})} ;
  • два регистра конечного автомата r i = ( r 1 ( i ) , r 0 ( i ) ) {displaystyle r_{i}=(r_{1}^{(i)},r_{0}^{(i)})} .
  • Выход представляет собой ключевой поток (гамму), который формируется из 64-битных слов Z i {displaystyle Z_{i}} .

    Алгоритм

    В алгоритме Струмок можно выделить три основные функции:

  • функция инициализации I n i t {displaystyle Init} , которая принимает в качестве входных данных ключ K {displaystyle K} и вектор инициализации I V {displaystyle IV} , и производит начальное значение переменной состояния S 0 = ( s ( 0 ) , r ( 0 ) ) {displaystyle S_{0}=(s^{(0)},r^{(0)})} ;
  • функция следующего состояния N e x t {displaystyle Next} , которая принимает на вход переменную состояния S i = ( s ( i ) , r ( i ) ) {displaystyle S_{i}=(s^{(i)},r^{(i)})} и производит следующее значение переменной состояния S i + 1 = ( s ( i + 1 ) , r ( i + 1 ) ) {displaystyle S_{i+1}=(s^{(i+1)},r^{(i+1)})} ;
  • функция ключевого потока S t r m {displaystyle Strm} , что принимает на входе переменную состояния S i = ( s ( i ) , r ( i ) ) {displaystyle S_{i}=(s^{(i)},r^{(i)})} и производит на выходе ключевой поток Z i {displaystyle Z_{i}} (64 бита).
  • Функция инициализации I n i t {displaystyle Init}

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

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

  • В 16 ячеек регистра сдвига заносится значения, сформированные на основании ключа и вектора инициализации. Таким образом формируется S − 33 = ( s ( − 33 ) , r ( − 33 ) ) {displaystyle S_{-33}=(s^{(-33)},r^{(-33)})} .
  • Выполняются 32 инициирующих такта без генерации ключевого потока(выполнение функции Next в режиме инициализации INIT ): S − 1 = N e x t 32 ( S − 33 , I N I T ) {displaystyle S_{-1}=Next^{32}(S_{-33},INIT)} .
  • Рассчитывается начальное значение переменной состояния: S 0 = N e x t ( S − 1 ) {displaystyle S_{0}=Next(S_{-1})} .
  • Выводится значение S 0 = ( s ( 0 ) , r ( 0 ) ) {displaystyle S_{0}=(s^{(0)},r^{(0)})} .
  • Функция следующего состояния N e x t {displaystyle Next}

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

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

  • Обновляются значения регистров конечного автомата r i + 1 {displaystyle r_{i+1}} .
  • Обновляется значение 15 ячеек регистра сдвига: s j ( i + 1 ) = s j + 1 ( i ) , j = 0 , 1 , . . . , 14. {displaystyle s_{j}^{(i+1)}=s_{j+1}^{(i)},j=0,1,...,14.}
  • Обновляется значение 16 ячейки: s 15 ( i + 1 ) = ( s 0 ( i ) ⨂ α ) ⨁ ( s 11 ( i ) ⨂ α − 1 ) ⨁ s 13 ( i ) {displaystyle s_{15}^{(i+1)}=(s_{0}^{(i)}igotimes alpha )igoplus (s_{11}^{(i)}igotimes alpha ^{-1})igoplus s_{13}^{(i)}} при работе в обычном режиме и s 15 ( i + 1 ) = F S M ( s 15 ( i ) , r 1 ( i ) , r 2 ( i ) ) ⨁ ( s 0 ( i ) ⨂ α ) ⨁ ( s 11 ( i ) ⨂ α − 1 ) ⨁ s 13 ( i ) {displaystyle s_{15}^{(i+1)}=FSM(s_{15}^{(i)},r_{1}^{(i)},r_{2}^{(i)})igoplus (s_{0}^{(i)}igotimes alpha )igoplus (s_{11}^{(i)}igotimes alpha ^{-1})igoplus s_{13}^{(i)}} при режиме инициализации.
  • Выводится значение S i + 1 = ( s ( i + 1 ) , r ( i + 1 ) ) {displaystyle S_{i+1}=(s^{(i+1)},r^{(i+1)})} .
  • Функция ключевого потока S t r m {displaystyle Strm}

    Вход : Переменная состояния S i = ( s ( i ) , r ( i ) ) {displaystyle S_{i}=(s^{(i)},r^{(i)})} .

    Выход : ключевой поток Z i {displaystyle Z_{i}} .

  • Вычисляется значение Z i = F S M ( s 15 ( i ) , r 1 ( i ) , r 2 ( i ) ) ⨁ s 0 ( i ) {displaystyle Z_{i}=FSM(s_{15}^{(i)},r_{1}^{(i)},r_{2}^{(i)})igoplus s_{0}^{(i)}} .
  • Выводится значение Z i {displaystyle Z_{i}} .
  • Функция конечного автомата F S M {displaystyle FSM}

    Функция конечного автомата F S M {displaystyle FSM} используется в функциях S t r m {displaystyle Strm} и N e x t {displaystyle Next} .

    Вход : три 64-битных строки x 1 , x 2 , x 3 {displaystyle x_{1},x_{2},x_{3}} .

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

  • Вычисляется значение x = ( x 1 + 64 x 2 ) ⨁ x 3 {displaystyle x=(x_{1}+_{64}x_{2})igoplus x_{3}} .
  • Выводится значение x {displaystyle x} .
    • + 64 {displaystyle +_{64}} обозначает операцию сложения целых чисел по модулю 264 .

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

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

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

    f ( x ) = x 16 + x 13 + α − 1 x 11 + α , {displaystyle f(x)=x^{16}+x^{13}+alpha ^{-1}x^{11}+alpha ,}

    где α {displaystyle alpha } является корнем многочлена над полем G F ( 2 8 ) {displaystyle GF(2^{8})} :

    g ( x ) = x 8 + β 170 x 7 + β 166 x 6 + β 2 x 5 + β 224 x 4 + β 70 x 3 + β 2 {displaystyle g(x)=x^{8}+eta ^{170}x^{7}+eta ^{166}x^{6}+eta ^{2}x^{5}+eta ^{224}x^{4}+eta ^{70}x^{3}+eta ^{2}} ,

    где β {displaystyle eta } является корнем многочлена над полем G F ( 2 ) {displaystyle GF(2)} :

    p ( x ) = x 8 + x 4 + x 3 + x 2 + 1 {displaystyle p(x)=x^{8}+x^{4}+x^{3}+x^{2}+1} .

    Поле G F ( 2 8 ) {displaystyle GF(2^{8})} строится над полем G F ( 2 ) {displaystyle GF(2)} полиномом p ( x ) {displaystyle p(x)} .

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

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

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

    Тестирование направленное на определение случайности двоичных последовательностей NIST показывает, что алгоритм Струмок уступает SNOW 2.0.

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


  • Полуцелое число
  • Числа Леонардо
  • Матрица Адамара
  • Вторая гипотеза Харди — Литлвуда
  • RC4

  •  

    • Яндекс.Метрика
    • Индекс цитирования