Алгоритмы
Алгоритм ЯМБ

Алгоритм ЯМБ

Длинна ключа: 80, 96, 112, 128, 144, 160, 176, 192, 208, 224, 240, 256 бит.

Длинна IV: 32, 64, 96, 128 бит.

Архитектура (структура) алгоритма:

Блок-схема алгоритма приведена на Рис.1.

Алгоритм состоит из 3-х частей:

" линейного регистра сдвига с обратной связью (LFSR),

" нелинейной функции усложнения FM, использующей модифицируемую память M, размера 256 бит,

" регистра сдвига (SR).

Все узлы алгоритма используют и обмениваются данными из W32 - простанства 32-х битных векторов.

Длина LFSR равна 15. LFSR оперирует над полем GF(232) = F2[x]/g(x), где g(x) = x32+x27+x24+x20+x19+x17+x16+x12+x10+x9+x8+x7+x6+x3+1 - примитивный многочлен над F2. Элементы поля GF(232) - многочлены A0+A1x1+..+A31x31 степени не выше 31 - отождествляются с векторами (A0,A1,:,A31) W32. Характеристическим многочленом LFSR является f(y) = y15+y8+x, где x = (0,1,0,:0) GF(232).

Функция FM : W32 W32.

SR содержит 16 элементов Z232 - целых чисел A = A0+A121+:+A31231 из интервала [0, 232-1] - отождествляемых с векторами (A0,A1,:,A31) W32.

Заполнение LFSR, SR and memory M определяется на этапе развертывания ключа.

Порядок вычислений :

В соответствии с многочленом f(y) вычисляется очередной член линейной реккурентной последовательности - элемент GF(232). Он помещается в LFSR и передается на функцию FM. Выход с функции FM поразрядно складывается с входом и передается на регистр сдвига SR. Входное значение SR складывается по модулю 232 с выходным значением. Сумма - 32-х битный вектор выходной гаммы.

Функция усложнения FM.

Входной вектор (Y0,Y1 : Y31 ) разбивается на 4 байта a = (Y0, Y1,:Y7), b = (Y8,Y9,:Y15), c = (Y16,Y17,:Y23) и d = (Y24,Y25,:Y31). Над байтами a,b,c и d выполняется 12 однотипных операций H(U,T) в очередности, представленной на Рис.2.

Операция H(U,T) состоит в том, что из памяти M извлекается байт с номером, задаваемый байтом T, а на его место помещается сумму по модулю 256 извлеченного байта и байта U. Результатом операции является извлеченный байт. Байт T = (T0, : T7) задает номер байта значением T0+T121+:+T727. Под суммой по модулю 256 байтов U = ( U0, : U7) и V = (V0,: V7) понимается байт W = (W0, : W7) такой , что W0+W121+W222+:+W727 U0+U121+:U727+V0+V121+ : + V727 mod 256.

Итогом вычислений функции FM являются 4 байта A = (A0, A1, : A7), B = (B0, B1, : B7), C = (C0, C1, : C7) и D = (D0, D1, : D7), которые объединяются в результирующий выхоной 32-х битный вектор (A0, A1, : A7, B0, B1, : B7, C0, C1, : C7,D0, D1, : D7).

Обозначим через M(T) изменяемый байт памяти M в операции H(U,T). Вычисления функции FM тогда можно записать следующим образом:

b := b M(a), M(a) := M(a) + d mod 256

c := c M(d), M(d) := M(d) + b mod 256

a := a M(b), M(b) := M(b) + c mod 256

d := d M(c), M(c) := M(c) + a mod 256

c := c M(a), M(a) := M(a) + d mod 256

b := b M(d), M(d) := M(d) + c mod 256

a := a M(c), M(c) := M(c) + b mod 256

d := d M(b), M(b) := M(b) + a mod 256

b := b M(a), M(a) := M(a) + d mod 256

c := c M(d), M(d) := M(d) + b mod 256

a := a M(b), M(b) := M(b) + c mod 256

d := d M(c), M(c) := M(c) + a mod 256

Развертывание ключа.

Начальное заполнение LFSR.

LFSR состоит из 15 32-х битновых ячеек. Для заполнения LFSR необходимо 480 бит. Первые 256 бит формируются из ключа. Если длина ключа меньше 256 бит, то ключ повторяется несколько раз, пока суммарная длина последовательности не достигнет 256 бит. Биты сверх 256 отбрасываются. К сформированным 256 битам приписываются биты инициализационного вектора IV. Остальные биты получаются путем повторения необходимого числа раз фиксированных 72-х бит (0011 0010 1000 0010 0111 0010 1100 0010 0100 1110 1001 1110 0000 1110 0010 1110 1111 0110)

Начальное заполнение памяти M приведено в таблице 1.

Начальное заполнение SR может быть произвольным: при развертывании ключа происходит замещение SR новыми значениями.

Рис. 1

Рис. 2

Таблица 1

00

01

02

03

04

05

06

07

08

09

0A

0B

0C

0D

0E

0F

00

85

2D

43

2F

A6

40

F8

1B

A9

B4

1C

58

E8

A5

D7

56

10

6B

03

38

67

3D

B1

7B

0B

F2

CB

29

FC

53

75

05

CA

20

0E

AE

D1

9C

BC

B0

DF

62

CF

3A

FE

DC

20

83

88

68

30

41

24

45

01

91

F0

A0

F6

65

02

B5

BE

0F

E5

13

D4

40

BF

A4

86

4A

63

82

4B

AC

9E

E2

7F

50

6C

EC

31

44

50

09

94

9A

40

06

C3

37

F4

2A

57

7C

25

99

FA

21

3B

60

EE

54

3C

22

B8

EB

51

8C

87

66

10

27

6D

AA

CE

39

70

E0

BD

8B

9B

69

B6

E7

36

AF

DE

34

93

9F

A2

60

14

80

7D

A7

8D

7E

76

48

72

74

23

CD

73

D9

33

D6

B2

78

90

9D

3F

32

8E

ED

5B

2B

4F

D3

E9

1E

4C

16

4E

3B

C5

A0

D8

E3

2E

26

28

8A

12

64

FB

A3

FF

AD

E1

B7

1A

D0

B0

F1

BA

7A

A1

00

D2

E4

C6

C0

30

81

52

92

46

61

C1

C0

95

1F

2C

C2

4D

42

49

07

5A

FD

0C

70

CC

84

F9

D5

D0

5E

18

B9

5D

C9

5C

C4

1D

6E

35

59

DB

15

79

DD

E6

E0

DA

A8

89

80

98

5F

EF

96

19

E7

C7

3E

47

0D

71

EA

F0

04

BB

55

77

C8

0A

17

97

AB

8F

11

08

E3

6F

F5

A6

Развертывание ключа производится в 4 этапа.

Этап 1. Перемешивание памяти M и LFSR.

Использую начальное заполнение LFSR и M последовательно вычисляется 225 32-х битных векторов гаммы. Сам вектор отбрасывается, но полученные заполнение LFSR и M используются в последующих вычислениях.

Этап 2. Модификация памяти M.

При модификации память M рассматривается как 64 32-х битных вектора M = (M0,M1,:M63), где Mi = (m32i,m32i+1,:,m32i+31). Вычисляется первый 32-х битный вектор гаммы и прибавляется к M0 по модулю 232 , так же как при сложении элементов SR. На полученной памяти вычислеяет следующий вектор гаммы и прибавляется по модулю 232 к M1. Описанная процедура продолжается до тех пор, пока не будут модифицированы все 64 вектора памяти.

Этап 3. Смена заполнения LFSR.

Вычисляются и последовательно запоминаются 15 32-х битных векторов гаммы. После сформирования 15 векторов гаммы, они замещают текущие вектора LFSR в соответствии с порядком их получения: первый вектор записывается в ячейку 0, второй - в ячейку 1, и т.д.

Этап 4. Очищение заполнения SR.

Использую текущее заполнение LFSR, M и SR последовательно вычисляется 16 векторов гам. Сами вектора отбрасываются, но полученные заполнение LFSR, M и SR используются в последующих вычислениях.

Развертывание ключа эквивалентно вычислению 320 векторов гаммы. После развертывания ключа вырабатываемая гамма используется для шифрования.