Самосжимающийся генератор
Самосжимающийся генератор — генератор псевдослучайных чисел, который основан на идеи сжимающегося генератора.
Однако в отличие от него самосжимающийся генератор использует только один регистор сдвига с линейной обратной связью.
Алгоритм[править]
Основным отличием алгоритма самосжимающегося генератора является рассмотрение выходных битов РСЛОС не по отдельности, а по парам. Пошагово алгоритм выглядит так:
- Дважды запускаем РСЛОС, формируем пару из двух битов на выходе.
- Если парой является '10', на выходе генератора - 0.
- Если парой является '11', на выходе генератора - 1.
- В противном случае на выходе ничего нет.
- Возвращаемся к первому шагу.
Взаимосоотвествие с сжимающимся генератором[править]
Утверждение №1. Самосжимающийся генератор может быть представлен, как сжимающийся генератор.
Доказательство. Пусть a = (a0,a1,a2,...) - последовательность длины N, сгенерированная РСЛОС, которая определяет выход самосжимающегося генератора. Тогда (a0, a2, a4, ...) определяет наличие битов на выходе, а (a1, a3, ... ) определяет последовательность выхода. Обе последовательности могут быть сгенерированы двумя РСЛОС с начальными состояниями (a0,a2, ..., a2N-2) и (a1,a3,...,a2N-1). Таким образом самосжимающийся генератор может быть представлен сжимающимся генератором, у которого оба РСЛОС имеют одинаковую обратную связь.
Утверждение №2. Сжимающися генератор может быть реализован как частный случай самосжимающегося генератора.
Доказательство. Рассмотрим два РСЛОС с начальными последовательностями битов b = (b0,b1,...) и c = (c0,c1,...) с полиномами обратной связ b(x) и c(x) соответственно. Далее сформируем последовательность a = (c0,b0,c1,b1,...). Если, например, в c0 (управляющая последовательность) находится 0, тогда на выходе самосжимающегося генератора ничего не будет. А если в c0 будет находиться 1, тогда на выходе будет b0. Таким образом, выходы сжимающегося и соответствующего ему самосжимающегося генератора будут одинаковы. Утверждение доказано.
Возможная реализация[править]
Ниже приведен код возможной реализации на языке 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())
Ссылки[править]
- Othmar Staffelbach, Willi Meier The self-shrinking generator (англ.) // Advances in Cryptology — EUROCRYPT'94. — Springer, Berlin, Heidelberg, 1994-05-09. — С. 205–214. — ISBN 9783540601760, 9783540447177. — DOI:10.1007/BFb0053436