Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Беззатеев и др. Блоковые шифры.pdf
Скачиваний:
254
Добавлен:
02.04.2015
Размер:
1.75 Mб
Скачать

50

После чего выполняются преобразования в 16 циклах ( r =0,,15 ):

(Fr,0 , Fr,1 ) = F (Rr,0 , Rr,1 , r) ,

Rr+1,0 =ЦСП(Rr,2 Fr,0 ,1) ,

Rr+1,1 =ЦСЛ(Rr,3,1) Fr,1 ,

Rr+1,2 = Rr,0 ,

Rr+1,3 =Rr,1 ,

где ЦСЛ и ЦСП — функции циклического сдвига влево и вправо, соответственно. При этом второй аргумент этих функций указывает число бит, на которое такой сдвиг происходит. Заключительное преобразование — сложение по модулю два:

Ci = R16,(i+2) mod 4 Ki+4 , i =0,,3.

Затем четыреполученных слова переписываются в16 байт c0 ,c1,,c15 зашифрованного сообщения:

 

 

 

 

C i / 4

 

 

 

 

с

=

 

 

 

 

mod 28

, i = 0,...,15

 

8(i mod4)

i

 

2

 

 

 

 

 

 

 

 

 

 

где ... означает округление числа до ближайшего целого в меньшую сторону.

Рассмотрим теперь подробнее отдельные преобразования, используемые в алгоритме.

Функция F

Функция F — 64-битная перестановка, зависящая от ключа. Ее аргументами являются два 32битных слова R0 и R1 , и индекс цикла r , используемый для выбора соответствующих блоков

ключа. R0 подвергается преобразованию, определяемому функцией g , в результате получается блок T0 . R1 первоначально циклически сдвигается на 8 бит влево, а затем также подвергается преобразованию g , в результате чего получается блок T1 . Далее блоки T0 и T1 трансформируются с помощью ПАП и складываются по модулю два с соответствующими блоками ключа.

Формально функцию F можно записать следующим образом:

T0 = g(R0 ),

T1 = g(ЦСЛ(R1,8)),

F0 = (T0 +T1 + K2r+8 ) mod 232 ,

F1 = (T0 + 2T1 + K2r+9 ) mod 232 ,

где F0 , F1 — результат функции F .

Преобразование g

По признанию авторов, это преобразование является "сердцем" алгоритма Twofish. Исходный блок X (равный R0 или ЦСЛ(R1,8) ) разбивается на четыре байта. Каждый байт подвергается

преобразованию в соответствующей S-box, функционирование которой зависит от значения соответствующего блока ключа (реализация S-box определяется специальной функцией h , которая будет описана ниже). Результатом преобразования 8-битного блока xi в S-box si является также 8-

битный блок yi . Эти четыре блока yi ( i =0,,3 или i =4,,7 ) представляются как вектор дли-

ны 4 над GF(28), который затем умножается на МДР1-матрицу 4×4 (при этом все операции выполняются в поле GF(28)). После выполнения такой операции получается 32-битное слово Z , которое и является результатом преобразования g .

1 МДР-матрица является порождающей матрицей специального класса помехоустойчивых кодов, разделимых кодов с максимальным расстоянием. Более подробную информацию можно найти в книге Ф.Дж. МакВильямс, Н.Дж.А.Слоэн "Теория кодов, исправляющих ошибки", М., Связь, 1979.

m0 ,,m8k 1 . Эти байты первона-

51

Формально преобразование g можно записать следующим образом:

xi = X / 28i mod 28 , i = 0,...,3; yi = si [xi ], i = 0,...,3;

z0

 

 

 

z

 

1

 

=

МДР

z2

 

 

 

 

 

 

z3

 

 

 

3

Z = zi 28i.

i=0

y0 y1 ; y2 y3

Поле GF(28), используемое в вычислениях, перечисленных выше, задается примитивным многочленом

m(x) = x8 +x6 +x5 +x3 +1.

Используемая в алгоритме МДР-матрица имеет следующий вид:

 

МДР

 

 

 

 

 

 

 

 

 

 

 

=

01

EF

5B

5B

 

,

5B

EF

EF

01

 

EF

5B

01

EF

 

EF

01

EF

5B

 

 

 

 

где элементы матрицы записаны в шестнадцатеричной системе счисления.

Генерация ключей

Процедура генерации ключей обеспечивает создание 40 слов расширенного ключа и четырех зависимых от ключа S-box, используемых в функции g . Как отмечалось ранее, алгоритм Twofish

рассчитан на ключ длиной N =128 , 192 или 256 бит. Если длина ключа не совпадает с этими величинами, то недостающие до ближайшего установленного N биты ключа назначаются равными нулю.

Определим величину k =N /64 . Ключ M состоит из 8k байт чально переписываются в 2k слов по 32 бита в каждом,

3

M i =m(4i+ j) 28 j , i =0,...,2k 1,

j=0

азатем в два вектора длины k :

Mч = (M 0 , M 2 , , M 2k2 ), M н = (M1, M 3, , M 2k1 ).

Третий вектор длины k также получается из исходного ключа. Для этого байты ключа группируются по 8 и интерпретируются как вектора, составленные из элементов GF(28). Затем эти вектора умножаются справа на матрицу 4×8 , полученную из порождающей матрицы помехоустойчивого кода Рида-Соломона над GF(28) c длиной кодового слова 12 и порождающим многочленом четвертой степени, так что (si,0 si,1si,2 si,3m8i m8i+1m8i+2m8i+3m8i+4m8i+5m8i+6m8i+7 ) — кодовое слово этого

кода. То есть (m8i m8i+1m8i+2m8i+3m8i+4m8i+5m8i+6m8i+7 ) — информационные, а (si,0si,1si,2 si,3 ) — проверочные символы:

si,0

si,1

si,2

si,3

 

. ...

 

 

= . РС

 

 

 

. ...

 

 

m8im8i+1m8i+2

.. m8i+3 ,

. m8i+4m8i+5m8i+6m8i+7

3

Si = si, j 28 j , j=0

для i =0,,k 1 .

52

Таким образом, из каждых восьми байт исходного ключа получается 32-битное слово. Эти слова и формируют третий вектор S :

S =(Sk 1,Sk 2 ,...,S0 ).

Здесь следует отметить, что компоненты записываются в вектор S в обратном порядке.

Для перемножения вектора на проверочную матрицу кода РС используется таблица умножения для элементов GF(28) с примитивным многочленом w(x) = x8 +x6 +x3 +x2 +1 ,

.

... .

 

=

 

01

A4

55

87

5A

58

DB

9E

 

.

РС .

 

A4

56

82

F3

1E

C6

68

E5 .

 

.

... .

 

 

 

02

A1

FC

C1

47

AE

3D

19

 

 

 

 

 

 

55

87

5A

58

DB

9E

03

 

 

 

 

A4

 

Векторы Mч , M н и S образуют базис для алгоритма генерации ключей с использованием функции h .

Замечание: Следует отметить различие примитивных многочленов, задающих поле GF(28), и тем самым определяющих правила вычислений в этом случае и при реализации преобразования g .

Функция h

На Рис. 4.10 представлена схема функции h . У этой функции два аргумента — 32-битное слово X и список L =(L0 ,, Lk 1 ) из k 32-битных слов, результатом ее выполнения является 32битное слово Z .

Формально выполнение функции h можно записать следующим образом: li, j = Li / 28 j mod 28 ,

x j = X / 28 j mod 28 ,

для i =0,,k 1 и j =0,,3 . Затем выполняется последовательность подстановок и сложений по модулю два.

yk , j = x j , j =0,,3 ;

для k =4 :

y3,0 = q1[ y4,0 ] l3,0 ; y3,1 = q0 [ y4,1 ] l3,1 ; y3,2 = q0 [ y4,2 ] l3,2 ; y3,3 = q1[ y4,3 ] l3,3 ;

для k 3:

y2,0 = q1[ y3,0 ] l2,0 ; y2,1 = q1[ y3,1 ] l2,1 ; y2,2 = q0 [ y3,2 ] l2,2 ; y2,3 = q0 [ y3,3 ] l2,3 ;

при всех значениях k будет выполняться:

y0 = q1[q0 [q0 [ y2,0 ] l1,0 ] l0,0 ] ; y1 = q0 [q0 [q1[ y2,1 ] l1,1 ] l0,1 ] ; y2 = q1[q1[q0 [ y2,2 ] l1,2 ] l0,2 ] ; y3 = q0 [q1[q1[ y2,3 ] l1,3 ] l0,3 ] ;

где q0 и q1 — фиксированные преобразования для 8-битных векторов, которые будут рассмотрены немного позже.

53

Рис. 4.10. Общая схема функции h .

Результирующий вектор из y0 , y1 , y2 , y3 перемножается на МДР-матрицу, так же, как это делалось в функции g :

z0

 

 

 

 

 

 

z1

 

=

.

z2

 

.

 

 

 

.

z3

 

 

 

 

 

 

 

y0

 

...

.

 

 

 

 

 

y1

 

МДР

.

 

y2

,

...

.

 

 

 

 

 

 

 

 

y3

 

3

Z = zi 28i ,

i=0

где Z — результат функции h .