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

Материал из testwiki
Перейти к навигации Перейти к поиску

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

Алгоритм

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

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

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

Утверждение №1. Самосверточный генератор может быть представлен, как сверточный генератор[3].
Доказательство. Пусть a=(a0,a1,a2,...) - последовательность длины N, сгенерированная РСЛОС, которая определяет выход самосверточного генератора. Тогда (a0,a2,a4,...)определяет наличие битов на выходе, а (a1,a3,...) определяет последовательность выхода. Обе последовательности могут быть сгенерированы двумя РСЛОС с начальными состояниями (a0,a2,...,a2N2) и (a1,a3,...,a2N1). Таким образом самосверточный генератор может быть представлен сверточным генератором, у которого оба РСЛОС имеют одинаковую обратную связь.
Утверждение №2. Сверточный генератор может быть реализован как частный случай самосверточного генератора[3].
Доказательство. Рассмотрим два РСЛОС с начальными последовательностями битов b=(b0,b1,...) и c=(c0,c1,...) с полиномами обратной связи b(x) и c(x) соответственно. Далее сформируем последовательность a=(c0,b0,c1,b1,...). Если, например, в c0 (управляющая последовательность) находится 0, тогда на выходе самосверточного генератора ничего не будет. А если в c0 будет находиться 1, тогда на выходе будет b0. Таким образом, выходы сверточного и соответствующего ему самосверточного генератора будут одинаковы. Утверждение доказано.

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

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

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

Предположим, что известна последовательность (s0,s1,...) выхода самосверточного генератора. Бит s0 получен из пары (aj,aj+1), где j - некоторый неизвестный индекс.Тогда aj=1, а aj+1=s0. Для следующей пары битов (aj+2,aj+3) возможны три случая.

  1. aj+2=1,aj+3=s1.
  2. aj+2=0,aj+3=0.
  3. aj+2=0,aj+3=1.

В двух последних случаях генерации s1 не происходит. Далее для каждых из трех случаев пара (aj+4,aj+5) образует три аналогичных случая. Таким образом, для восстановления n пар (то есть 2n=N битов) необходимо рассмотреть: S=3n13N/2=2((log23)/2)N=20.79*N случаев
Необходимо учеть то, что варианты не являются равновероятными. Если предположить, что восстанавливаемая последовательность случайна, тогда вероятность того, что P(aj+2=1)=1/2, а остальные два случая также равновероятны: P(aj+2=0,aj+3=0)=P(aj+2=0,aj+3=1)=1/4
Тогда информационная энтропия пары битов (aj+2,aj+3):
H=(1/2)log2(1/2)(1/4)log2(1/4)(1/4)log2(1/4)=1.5
Предполагая, что пары битов независимы между собой, общая энтропия будет равна 3n/2. Если использовать оптимальную стратегию для восстановления N бит, тогда средняя сложность будет равняться 20.75N[3]
Если предположить, что известны некоторая последовательность на выходе генератора длиной N и полином обратной связи, тогда возможно уменьшить время атаки до 20.694N [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())

Пример

В качестве примера возьмем полином связи x7+x5+x2+x+1 и начальное состояние 1110001.

Номер итерации x7 x6 x5 x4 x3 x2 x1 Выход РСЛОС Выход генератора
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

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

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

Существует[5] обобщение бинарного самосверточного генератора. Рассматривается p-ичный РСЛОС длины N c начальным состоянием (a0,a1,...,aN). На его выходе образуется последовательность чисел ai:p1ai0. Коэффициенты полинома обратной связи удовлетворяют неравенствам: p1qi0.
Далее алгоритм работы следующей:

  1. Путем запуска pичного РСЛОС получаем последовательность (a0,a1,...,ap1)
  2. Если a0=0, тогда на выходе генератора ничего нет.
  3. Если a0=1, тогда на выходе a1. И остальные символы в последовательности игнорируются.
  4. По аналогии: если a0=i, то генератор выдает ai. Оставшиеся символы не учитываются.
  5. Каждый элемент последовательности преобразуется в бинарный: 2[log2(p1)]p12. Если p=0, тогда этот элемент преобразуется в 1, в случае если предыдущий равен p1 или в (di1+1) mod p в противном случае.
  6. Вернуться к первому шагу.

Ссылки

Литература

  • 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

Шаблон:Изолированная статья