Анимация
JavaScript


Главная  Библионтека 

0 1 2 3 [ 4 ] 5 6 7 8 9 10 11 12 13 14 15 16 17

Простейшим видом сдвигового регистра с обратной связью является линейный сдвиговый регистр с обратной связью (linear feedback shift register, или LFSR) (см. 14th). Обратная связь представляет собой просто XOR некоторых битов регистра, перечень этих битов называется отводной последовательностью (tap sequence). Иногда такой регистр называется конфигурацией Фиббоначи. Из-за простоты последовательности обратной связи для анализа LFSR можно использовать довольно развитую математическую теорию . Криптографы любят анализировать последовательности, убеждая себя, что эти последовательности достаточно случа й-ны, чтобы быть безопасными. LFSR чаще других сдвиговых регистров используются в криптографии.

bn -1


Выходной бит

Рис. 16-2. Сдвиговый регистр с линейной обратной связью.

На 13-й показан 4-битовый LFSR с отводом от первого и четвертого битов. Если его проинициализировать значением 1111, то до повторения регистр будет принимать следующие внутренние состояния :

1 1 1 1

0 1 1 1

1 0 1 1

0 1 0 1

1 0 1 0 1 1 0 1

0 1 1 0

0 0 1 1

1 0 0 1

0 1 0 0 0 0 1 0

0 0 0 1

1 0 0 0 1 1 0 0

1 1 1 0

Выходной бит


Рис. 16-3. 4-битовый LFSR.

Выходной последовательностью будет строка младших значащих битов : 1 1 1 1 0 1 0 1 1 0 0 1 0 0 0. . . .

n-битовый LFSR может находиться в одном из 2 n-1 внутренних состояний. Это означает, что теоретически такой регистр может генерировать псевдослучайную последовательность с периодом 2n-1 битов. (Число внутренних состояний и период равны 2 n-1, потому что заполнение LFSR нулями, приведет к тому, что сдвиговый регистр будет выдавать бесконечную последовательность нулей, что абсолютно бесполезно .) Только при определенных отводных последовательностях LFSR циклически пройдет через все 2n-1 внутренних состояний, такие



LFSR являются LFSR последовательностью.

максимальным периодом. Получившийся результат называется

Для того, чтобы конкретный LFSR имел максимальный период, многочлен, образованный из отводной п о-следовательности и константы 1, должен быть примитивным по модулю 2. Степень многочлена является длиной сдвигового регистра. Примитивный многочлен степени n - это неприводимый многочлен, который является делителем x +1, но не является делителем xd+1 для всех d, являющихся делителями 2n-1 (см. раздел 11.3). Соответствующую математическую теорию можно найти в [643, 1649, 1648].

В общем случае не существует простого способа генерировать примитивные многочлены данной степени по модулю 2. Проще всего выбирать многочлен случайным образом и проверять, не является ли он примитивным . Это нелегко - и чем-то похоже на проверку, не является ли простым случайно выбранное число - но многие м а-тематические пакеты программ умеют решать такую задачу. Ряд методов приведен в [970, 971].

Некоторые, но, конечно же, не все, многочлены различных степеней, примитивные по модулю 2, приведены в 14-й [1583, 643, 1649, 1648, 1272, 691]. Например, запись (32, 7, 5, 3, 2, 1, 0) означает, что следующий многочлен примитивен по модулю 2:

x32 + x7 +x5 + x3 + x2 + x + 1

Это можно легко обобщить для LFSR с максимальным периодом. Первым числом является длина LFSR. Последнее число всегда равно 0, и его можно опустить . Все числа, за исключением 0, задают отводную последов а-тельность, отсчитываемую от левого края сдвигового регистра . То есть, члены многочлена с меньшей степенью соответствуют позициям ближе к правому краю регистра.

Продолжая пример, запись (32, 7, 5, 3, 2, 1, 0) означает, что для взятого 32-битового сдвигового регистра новый бит новый бит генерируется с помощью XOR тридцать второго, седьмого, пятого, третьего, второго и пе р-вого битов (см. 12th), получающийся LFSR будет иметь максимальную длину, циклически проходя до повтор е-ния через 232-1 значений.

Код для этого LFSR на языке C выглядит следующим образом:

int LFSR ( ) {

static unsigned long ShiftRegister = 1; /* Все, кроме 0. */

ShiftRegister = ((((ShiftRegister >> 31) (ShiftRegister >> 6) (ShiftRegister >> 4) (ShiftRegister >> 2) (ShiftRegister >> 1) ShiftRegister)) & 0x00000001)

<<31)

(ShiftRegister >> 1) ; return ShiftRegister & 0x00000001;

Если сдвиговый регистр длиннее компьютерного слова, код усложняется, но не намного .


Выходной бит

Рис. 16-4. 32-битовый LFSR с максимальной длиной. Табл. 16-2.

Некоторые примитивные многочлены по модулю 2

(1, 0) (2, 1, 0) (3, 1, 0) (4, 1, 0) (5, 2, 0) (6, 1, 0) (7, 1, 0)

(7, 3, 0) (8, 4, 3, 2, 0) (9, 4, 0) (10, 3, 0) (11, 2, 0) (12, 6, 4, 1, 0) (13, 4, 3, 1, 0)

(14, 5, 3, 1, 0) (15, 1, 0) (16, 5, 3.2, 0) (17, 3, 0) (17, 5, 0) (17, 6, 0) (18, 7, 0)

(18, 5, 2, 1, 0) (19, 5, 2, 1, 0) (20, 3, 0) (21, 2, 0) (22, 1, 0) (23, 5, 0) (24, 4, 3, 1, 0)



(25, 3, 0)

(46, 8, 5, 3, 2, 1, 0)

(68, 9, 0)

(225, 88, 0)

(26, 6, 2, 1, 0)

(47, 5, 0)

(68, 7, 5, 1, 0)

(225, 97, 0)

(27, 5, 2, 1, 0)

(48, 9, 7, 4, 0)

(69, 6, 5, 2, 0)

(225, 109, 0)

(28, 3, 0)

(48, 7, 5, 4, 2, 1, 0)

(70, 5, 3, 1, 0)

(231, 26, 0)

(29, 2, 0)

(49, 9, 0)

(71, 6, 0)

(231, 34, 0)

(з0, 6, 4, 1.0)

(49, 6, 5, 4, 0)

(71, 5, 3, 1, 0)

(234, 31, 0)

(з1, 3, 0)

(50, 4, 3, 2, 0)

(72, 10, 9, 3, 0)

(234, 103, 0)

(з1, 6, 0)

(51, 6, 3, 1, 0)

(72, 6, 4, 3, 2, 1, 0)

(236, 5, 0)

(з1, 7, 0)

(52, 3, 0)

(73, 25, 0)

(250, 103, 0)

(з1, 13, 0)

(53, 6, 2, 1, 0)

(73, 4, 3, 2, 0)

(255, 52, 0)

(з2, 7, 6, 2, 0)

(54, 8, 6, 3, 0)

(74, 7, 4, 3, 0)

(255, 56, 0)

(з2, 7, 5, 3, 2, 1, 0)

(54, 6, 5, 4, 3, 2, 0)

(75, 6, 3, 1, 0)

(255, 82, 0)

(зз, 13, 0)

(55, 24, 0)

(76, 5, 4, 2, 0)

(258, 83, 0)

(зз, 16, 4, 1, 0)

(55, 6, 2, 1, 0)

(77, 6, 5, 2, 0)

(266, 47, 0)

(з4, 8, 4, 3, 0)

(56, 7, 4, 2, 0)

(78, 7, 2, 1, 0)

(97, 6, 0)

(з4, 7, 6, 5, 2, 1, 0)

(57, 7, 0)

(79, 9, 0)

(98, 11, 0)

(з5, 2, 0)

(57, 5, 3, 2, 0)

(79, 4, 3, 2, 0)

(98, 7, 4, 3, 1, 0)

(135, 11, 0)

(58, 19.0)

(80, 9, 4, 2, 0)

(99, 7, 5, 4, 0)

(135, 16, 0)

(58, 6, 5, 1, 0)

(80, 7, 5, 3, 2, 1, 0)

(100, 37, 0)

(135, 22, 0)

(59, 7, 4, 2, 0)

(81, 4, 0)

(100, 8, 7, 2, 0)

(136, 8, 3, 2, 0)

(59, 6, 5, 4, 3, 1, 0)

(82, 9, 6, 4, 0)

(101, 7, 6, 1, 0)

(137, 21, 0)

(60, 1, 0)

(82, 8, 7, 6, 1, 0)

(102, 6, 5, 3, 0)

(138, 8, 7, 1, 0)

(61, 5, 2, 1, 0)

(83, 7, 4, 2, 0)

(103, 9, 9)

(139, 8, 5, 3, 0)

(62, 6, 5, 3, 0)

(84, 13, 0)

(104, 11, 10, 1, 0)

(140, 29, 0)

(63, 1, 0)

(84, 8, 7, 5, 3, 1, 0)

(105, 16, 0)

(141, 13, 6, 1, 0)

(64, 4, 3, 1, 0)

(85, 8, 2, 1, 0)

(106, 15, 0)

(142, 21, 0)

(65, 18, 0)

(86, 6, 5, 2, 0)

(107, 9, 7, 4, 0)

(143, 5, 3, 2, 0)

(65, 4, 3, 1, 0)

(87, 13, 0)

(108, 31, 0)

(144, 7, 4, 2, 0)

(66, 9, 8, 6, 0)

(87, 7, 5, 1, 0)

(109, 5, 4, 2.0)

(145, 52, 0)

(66, 8, 6, 5, 3, 2, 0)

(88, 11, 9, 8, 0)

(110, 6, 4, 1, 0)

(145, 69, 0)

(67, 5, 2, 1, 0)

(88, 8, 5, 4, 3, 1, 0)

(111, 10, 0)

(146, 5, 3, 2, 0)

(152, 6, 3, 2, 0)

(89, 38, 0)

(111, 49, 0)

(147, 11, 4, 2, 0)

(153, 1, 0)

(89, 51, 0)

(113, 9, 0)

(148, 27, 0)

(153, 8, 0)

(89, 6, 5, 3, 0)

(113, 15, 0)

(149, 10, 9, 7, 0)

(154, 9, 5, 1, 0)

(90, 5, 3, 2, 0)

(113, 30, 0)

(150, 53, 0)

(155, 7, 5, 4, 0)

(91, 8, 5, 1, 0)

(114, 11, 2, 1, 0)

(151, 3, 0)

(156, 9, 5, 3, 0)

(91, 7, 6, 5, 3, 2, 0)

(115, 8, 7, 5, 0)

(151, 9, 0)

(157, 6, 5, 2, 0)

(92, 6, 5, 2, 0)

(116, 6, 5, 2, 0)

(151, 15, 0)

(158, 8, 6, 5, 0)

(93, 2, 0)

(117, 5, 2, 1, 0)

(151, 31, 0)

(159, 31, 0)

(94, 21, 0)

(118, 33, 0)

(151, 39, 0)

(159, 34, 0)

(94, 6, 5, 1, 0)

(119, 8, 0)

(151, 43, 0)

(159, 40, 0)

(95, 11, 0)

(119, 45, 0)

(151, 46, 0)

(160, 5, 3, 2, 0)

(95, 6, 5, 4, 2, 1, 0)

(120, 9, 6, 2, 0)

(151, 51, 0)

(161, 18, 0)

(96, 10, 9, 6, 0)

(121, 18, 0)

(151, 63, 0)

(161, 39, 0)

(96, 7, 6, 4, 3, 2, 0)

(122, 6, 2, 1, 0)

(151, 66, 0)

(161, 60, 0)

(178, 87, 0)

(123, 2, 0)

(151, 67, 0)

(162, 8, 7, 4, 0)

(183, 56, 0)

(124, 37, 0)

(151, 70, 0)

(163, 7, 6, 3, 0)

(194, 87, 0)

(125, 7, 6, 5, 0)

(з6, 11, 0)

(164, 12, 6, 5, 0)

(198, 65, 0)

(126, 7, 4, 2, 0)

(з6, 6, 5, 4, 2, 1, 0)

(165, 9, 8, 3, 0)

(201, 14, 0)

(127, 1, 0)

(з7, 6, 4, 1, 0)

(166, 10, 3, 2, 0)

(201, 17, 0)

(127, 7, 0)

(з7, 5, 4, 3, 2, 1, 0)

(167, 6, 0)

(201, 59, 0)

(127, 63, 0)

(з8, 6, 5, 1, 0)

(170, 23, 0)

(201, 79, 0)

(128, 7, 2, 1, 0)

(39, 4, 0)

(172, 2, 0)

(202, 55, 0)

(129, 5, 0)

(40, 5, 4, 3, 0)

(174, 13, 0)

(207, 43, 0)

(130, 3, 0)

(41, 3, 0)

(175, 6, 0)

(212, 105, 0)

(131, 8, 3, 2, 0)

(42, 7, 4, 3, 0)

(175, 16, 0)

(218, 11, 0)

(132, 29, 0)

(42, 5, 4, 3, 2, 1, 0)

(175, 18, 0)

(218, 15, 0)

(133, 9, 8, 2, 0)

(43, 6, 4, 3, 0)

(175, 57, 0)

(218, 71, 0)

(134, 57, 0)

(44, 6, 5, 2, 0)

(177, 8, 0)

(218.83, 0)

(270, 133, 0)

(45, 4, 3, 1, 0)

(177, 22, 0)

(225, 32, 0)

(282, 35, 0)

(46, 8, 7, 6, 0)

(1 77, 88, 0)

(225, 74, 0)

(282, 43, 0)



0 1 2 3 [ 4 ] 5 6 7 8 9 10 11 12 13 14 15 16 17