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

Материал из Википедии — свободной энциклопедии
Перейти к навигации Перейти к поиску

Самосверточный генератор[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