Самосверточный генератор

Самосверточный генератор[1] — это генератор псевдослучайных чисел, который основан на идеи сверточного генератора. Однако в отличие от него самосверточный генератор использует только один регистор сдвига с линейной обратной связью.

Алгоритм править

Основным отличием алгоритма самосверточного генератора является рассмотрение выходных битов РСЛОС не по отдельности, а по парам. Пошагово алгоритм[2] выглядит так:

  1. Дважды запускаем РСЛОС, формируем пару из двух битов на выходе.
  2. Если парой является '10', на выходе генератора - 0.
  3. Если парой является '11', на выходе генератора - 1.
  4. В противном случае на выходе ничего нет.
  5. Возвращаемся к первому шагу.

Взаимосоответствие со сверточным генератором править

Утверждение №1. Самосверточный генератор может быть представлен, как сверточный генератор[3].
Доказательство. Пусть   - последовательность длины N, сгенерированная РСЛОС, которая определяет выход самосверточного генератора. Тогда  определяет наличие битов на выходе, а   определяет последовательность выхода. Обе последовательности могут быть сгенерированы двумя РСЛОС с начальными состояниями   и  . Таким образом самосверточный генератор может быть представлен сверточным генератором, у которого оба РСЛОС имеют одинаковую обратную связь.
Утверждение №2. Сверточный генератор может быть реализован как частный случай самосверточного генератора[3].
Доказательство. Рассмотрим два РСЛОС с начальными последовательностями битов   и   с полиномами обратной связи   и   соответственно. Далее сформируем последовательность  . Если, например, в   (управляющая последовательность) находится 0, тогда на выходе самосверточного генератора ничего не будет. А если в   будет находиться 1, тогда на выходе будет  . Таким образом, выходы сверточного и соответствующего ему самосверточного генератора будут одинаковы. Утверждение доказано.

Период и линейная сложность править

Утверждение №1. Пусть   - последовательность максимального периода, сгенерированная РСЛОС длины  . Пусть также   - последовательность на выходе самосверточного генератора. Тогда период   делится на  [3].
Пусть далее   - максимальная последовательность на выходе самосверточного генератора РСЛОС длины N. Тогда справедливы:
Утверждение №2. Период   последовательности   удовлетворяет:  [4].
Утверждение №3. Линейная сложность последовательности   удовлетворяет неравенству:  [3].
Cогласно экспериментальным данным, период   всегда достигает максимального значения при N>3 [4]

Криптоанализ править

Предположим, что известна последовательность   выхода самосверточного генератора. Бит   получен из пары  , где   - некоторый неизвестный индекс.Тогда  , а  . Для следующей пары битов   возможны три случая.

  1.  .
  2.  .
  3.  .

В двух последних случаях генерации   не происходит. Далее для каждых из трех случаев пара   образует три аналогичных случая. Таким образом, для восстановления   пар (то есть   битов) необходимо рассмотреть:   случаев
Необходимо учеть то, что варианты не являются равновероятными. Если предположить, что восстанавливаемая последовательность случайна, тогда вероятность того, что  , а остальные два случая также равновероятны:  
Тогда информационная энтропия пары битов  :
 
Предполагая, что пары битов независимы между собой, общая энтропия будет равна  . Если использовать оптимальную стратегию для восстановления   бит, тогда средняя сложность будет равняться  [3]
Если предположить, что известны некоторая последовательность на выходе генератора длиной   и полином обратной связи, тогда возможно уменьшить время атаки до   [4]

Возможная реализация править

Ниже приведен код возможной реализации на языке Python 3

# Регистр сдвига с обратной линейной связью
class LFSR():

        def __init__(self,f,initial_state):
                self.f = f # Коэффициенты многочлена по убыванию степени
                self.state = initial_state # текущее состояние
        # Вычисление нового элемента
        def new_elem(self):
                new_el = 0
                for i,j in zip(self.f,self.state):
                        new_el +=  int(i)*int(j)
                return str(new_el%2)
        # Выход регистра
        def get_output(self):
                last_elem = self.state[-1]
                self.update_state()
                return last_elem
        # Обновление состояния
        def update_state(self): # 
                self.state = self.new_elem()+self.state[:-1]
# Самосверточный генератор
class SelfShrinking():
        def __init__(self,lfsr):
                self.lfsr = lfsr
        # Выход генератора
        def get_output(self):
                fst_output = self.lfsr.get_output()
                snd_output = self.lfsr.get_output()
                pair = fst_output + snd_output
                if pair == '10':
                        return '0'
                elif pair == '11':
                        return '1'
                else:
                        return 'N/A'

if __name__ == '__main__':
        lfsr = LFSR('10001110','10110110')
        selfshr = SelfShrinking(lfsr)
        ITTERATIONS = 20
        for i in range(ITTERATIONS):
                print(selfshr.get_output())

Пример править

В качестве примера возьмем полином связи   и начальное состояние  .

Номер итерации               Выход РСЛОС Выход генератора
1 1 1 1 0 0 0 1 - -
2 1 1 1 1 0 0 0 1 -
3 0 1 1 1 1 0 0 0 0
4 1 0 1 1 1 1 0 0 -
5 1 1 0 1 1 1 1 0 -
6 1 1 1 0 1 1 1 1 -
7 0 1 1 1 0 1 1 1 1

После первых трех итераций на генератор подается пара битов  , которая согласно пункту 2 алгоритму преобразуется в  . На пятой итерации на генератор подается пара битов  . Так как первый бит равен нулю, выход генератора не обновляется. На седьмой итерации на вход поступает пара  , которая согласно пункту 3 алгоритма преобразуется в  .

Обобщение самосверточного генератора править

Существует[5] обобщение бинарного самосверточного генератора. Рассматривается  -ичный РСЛОС длины   c начальным состоянием  . На его выходе образуется последовательность чисел  . Коэффициенты полинома обратной связи удовлетворяют неравенствам:  .
Далее алгоритм работы следующей:

  1. Путем запуска  ичного РСЛОС получаем последовательность  
  2. Если  , тогда на выходе генератора ничего нет.
  3. Если  , тогда на выходе  . И остальные символы в последовательности игнорируются.
  4. По аналогии: если  , то генератор выдает  . Оставшиеся символы не учитываются.
  5. Каждый элемент последовательности преобразуется в бинарный:  . Если  , тогда этот элемент преобразуется в 1, в случае если предыдущий равен   или в       в противном случае.
  6. Вернуться к первому шагу.

Ссылки править

  1. Кочергин В. И. Большой англо-русский толковый научно-технический словарь компьютерных информационных технологий и радиоэлектроники: В пяти томах. Т. 5 (S* - Z*). — Томск: Изд-во Том. ун-та., 2015.. — С. 68. — 755 с. — ISBN 978-5-7511-2331-4.
  2. Fontain C. Encyclopedia of Cryptography and Security (англ.) // Springer, Boston, MA. — 2011. — P. 1175.
  3. 1 2 3 4 5 Meier, Willi & Staffelbach, Othmar. The Self-Shrinking Generator. Lecture Notes in Computer Science (англ.) // LNCS. — 1994. — P. 205—214.
  4. 1 2 3 Zenner, Erik; Krause, Matthias; Lucks, Stefan. Improved Cryptanalysis of the Self-Shrinking Generator (англ.) // Information Security and Privacy 13th Australasian Conference ACISP 2008 : journal. — P. 30. Архивировано 20 апреля 2016 года.
  5. Todorova, Antoniya; Nikolova, Zhaneta; Petrov Milev, Aleksandar. "Generalization of the Self-Shrinking Generator in the Galois Field". Advances in Artificial Intelligence. Архивировано 20 декабря 2018. Дата обращения: 19 декабря 2018.

Литература править

  • Meier W., Staffelbach O. (1995) The self-shrinking generator. In: De Santis A. (eds) Advances in Cryptology — EUROCRYPT'94. EUROCRYPT 1994. Lecture Notes in Computer Science, vol 950. Springer, Berlin, Heidelberg