Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
gruppa_903a_proekt.doc
Скачиваний:
50
Добавлен:
10.02.2015
Размер:
23.8 Mб
Скачать

TwoFish

Криптоалгоритм Twofish, авторами которого являются Bruce Schneider, John Kelsey, Doug Whiting, Chris Hall и Niels Ferguson (США), шифрует 128‑битовые блоки открытых данных под управлением секретного ключа, длина которого может составлять N=128, 192 или 256 битов (далее рассматривается случай N=128; более короткие ключи дополняются до требуемой длины нулями.) По своей структуре Twofish является классическим шифром Фейстеля. Рекомендуемое число раундов шифрования R=16.

Блок P шифруемых данных, являющийся массивом из шестнадцати байтов: P=(p0,p1,…,p15), представляется так же в виде четырёх 4‑байтовых слов P0,P1,P2 и P3 с прямым порядком байтов (little-endian), т.е.

Pi=p4i+p4i+128+p4i+2216+p4i+3224, i=0,1,2,3.

Далее заглавные буквы обозначают 4‑байтовые слова, а строчные – составляющие их байты. Например, Х=(х0123) – слово с байтами х0123, начиная с младшего.

В алгоритме используются следующие операции и преобразования:

XÅY – побитовое сложение X и Y по модулю 2;

X+Y – сложение X и Y по модулю 232.

rols(X) (rors(X)) – циклический сдвиг слова X на s битов влево (вправо)

Псевдоадамарово преобразование РНТ определяется как

РНТ(Х,У)º{X:=X+Y; Y:=X+Y.}

Функция MDS(X) возвращает значение Y, определяемое как

y0

=

$01

$ef

$5b

$5b

=

x0

,

y1

$5b

$ef

$ef

$01

x1

y2

$ef

$5b

$01

$ef

x2

y3

$ef

$01

$ef

$5b

x3

причем байты интерпретируются как элементы конечного поля F256@F2[х]/v(x), где v(x)=x8+x6+x5+x3+1 – примитивный многочлен 8‑ой степени над полем F2.

Функция R(X,Y) возвращает значения Z, определяемое как

x0

x1

z0

=

$01

$a4

$55

$87

$5a

$58

$db

$9e

x2

,

z1

$a4

$56

$82

$f3

$1e

$c6

$68

$e5

x3

z2

$02

$a1

$fc

$c1

$47

$ae

$3d

$19

y0

z3

$a4

$55

$87

$5a

$58

$db

$9e

$e3

y1

y2

y3

причем в данном случае байты интерпретируются, как элементы конечного поля F256@F2[x]/w(x), где w(x)=x8+x6+x3+x2+1 – примитивный многочлен 8‑ой степени над полем F2.

Подстановки (перестановки) q0 и q1 заданы на множестве байтов. Для байта x значение y=qi[x], i=0,1, вычисляется по схеме:

(a,b):=(x div 16,x mod 16);

(c,d):=(aÅb,aÅ(b div 2)Å((8*b)mod 16)Å((8*a)mod 16));

(a,b):=(t0(i)[c],t1(i)[d]);

(c,d):=(aÅb,aÅ(b div 2)Å((8*b)mod 16)Å((8*a)mod 16));

(a,b):=(t2(i)[c],t3(i)[d]);

y:=16*b+a.

Здесь a,b,c,d – вспомогательные переменные (байты), а значения tj(i)[u] заданы следующей таблицей (в 16‑ичном представлении):

u

0

1

2

3

4

5

6

7

8

9

a

b

c

d

e

f

t0(0)

8

1

7

d

6

f

3

2

0

b

5

9

e

c

a

4

t1(0)

e

c

b

8

1

2

3

5

f

4

a

6

7

0

9

3

t2(0)

b

a

5

e

6

d

9

0

c

8

f

3

2

4

7

1

t3(0)

13

7

f

4

1

2

6

e

9

b

3

0

8

5

c

a

t0(1)

2

8

b

d

b

7

6

e

3

1

9

4

0

a

c

5

t1(1)

1

e

2

b

4

c

3

7

6

d

a

5

f

9

0

8

t2(1)

4

c

7

5

1

6

9

a

0

e

d

8

2

b

3

f

t3(1)

b

9

5

1

c

3

d

e

6

4

7

f

2

0

8

a

Функция h(X,Y,Z) возвращает значение W=MDS(U),где U=(u0,u1,u2,u3) определяется как:

u0:=q0[z0Åq1[y0Åq1[x0]]];

u1:=q1[z1Åq1[y1Åq0[x1]]];

u2:=q0[z2Åq0[y2Åq1[x3]]];

u3:=q1[z3Åq0[y3Åq0[x3]]].

Раундовая функция F[RK0,RK1,S0,S1](R0,R1) с 4‑байтовыми ключевыми параметрами RK0,RK1,S0 и S1 и аргументами R0 и R1 возвращает 4‑байтовые значения F0 и F1, определяемые как:

(F0,F1):=(h(R0,S0,S1),h(rol8(R1),S0,S1));

РНТ(F0,F1);

(F0,F1):=(F0+RK0,F1+RK1).

Вычисление раундовых подключей. На основе 16‑байтового секретного ключа K=(k0,k1,…,k15) вычисляются 4‑байтовые подключи S0 и S1, используемые в определении функции F и раундовые подключи K0,K1,…,K39 (для R‑раундового алгоритма необходимо 2R+8 подключей; здесь в качестве стандартного значения принято R=16):

for i:=0 to 3 do Mi=(k4i,k4i+1, k4i+2,k4i+3);

S0:=RS(M0,M1); S1:=RS(M2,M3);

(X,Y,Z):=(0,224+216+28+1,225+217+29+2);

for i:=0 to 19 do {

A:=h(X,M2,M0); B:=rol8(h(Y,M3,M1)); РНТ(A,B);

(K2i,K2i+1):=(A,rol9(B)); X:=X+Z; Y:=Y+Z}.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]