Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Математические основы криптологии..pdf
Скачиваний:
102
Добавлен:
05.02.2023
Размер:
6.01 Mб
Скачать

 

 

 

 

Рис. 2.25. Графическое представление системы

Работа счетчиков определяется следующим образом:

c0,i+1 = c0,i

+ a0 + 7,i mod 232,

 

 

 

c1,i+1 = c1,i

+ a0 + 0,i+1 mod 232,

 

 

 

c2,i+1 = c2,i

+ a0 + 1,i+1 mod 232,

 

 

 

c3,i+1 = c3,i

+ a0 + 2,i+1 mod 232,

 

 

 

c4,i+1

= c4,i

+ a0

+ 3,i+1 mod 232,

 

 

 

c5,i+1

= c5,i

+ a0

+ 4,i+1 mod 232,

 

 

 

c6,i+1

= c6,i

+ a0

+ 5,i+1 mod 232,

 

 

 

c7,i+1

= c7,i

+ a0

+ 6,i+1 mod 232,

 

 

 

где бит счетчика по переносу j,i+1 задан выражением

 

1

åñëè c

a

0

 

232

j 0

 

 

 

0,i

 

7,i

 

 

 

 

åñëè c j,i

aj

j 1,i 1 2

32

j 0

j,i 1 1

 

 

0

во всех остальных

случаях

 

 

 

 

 

 

 

 

 

 

Кроме того, константы aj определены как: a0 = 0x4D34D34D, a1 = 0xD34D34D3,

a2 = 0x34D34D34, a3 = 0x4D34D34D, a4 = 0xD34D34D3, a5 = 0x34D34D34, a6 = 0x4D34D34D, a7 = 0xD34D34D3.

После каждой итерации результат извлекается следующим образом:

si15..0

x015,i ..0 x531,i ..16

,

 

si 31..16

x031,i ..16 x315,i

..0 ,

si 47..32

 

x215,i ..0

x731,i ..16

 

,

si 63..48

x231,i

..16 x515,i ..0

,

si 79..64

 

x415,i ..0

x1,31i

..16

 

,

si 95..80

x431,i

..16 x715,i ..0

,

si111..96

x615,i ..0 x331,i

..16

, si127..112 x631,i ..16 x115,i

..0 .

Поточный шифр Salsa20

Ядром шифра Salsa20 является хеш-функция с 64-байтовым входом и 64-байтовым выходом [6]. Хеш-функция в режиме счетчика используется как поточный шифр: Salsa20 шифрует 64-байтовый блок открытого текста хешированием ключа, в данном случае, и номера блока, складывая результат по модулю 2 (XOR) с открытым текстом.

Хеш-функция Salsa20

Хеш-функция Salsa20(x) определяется следующим выражением:

181

Salsa20(x) = x + doubleround10(x),

где каждая 4-байтовая последовательность x рассматривается как слово в форме littleendian.

Если b = (b0, b1, b2, b3) – 32-битовое слово, где b3 и b0 обозначают соответственно самый старший байт и самый младший байт величины b, тогда

littleendian(b) = 224b3 + 216b2 + 28b1 + b0.

Функция doubleround(x) вычисляется путем последовательного применения к последовательности x из 16 слов (слово – 32-битовый элемент) функций columnround(x) и rowround(x):

doubleround(x) = rowround(columnround(x)).

Функций columnround(x) и rowround(x) в свою очередь строятся на основе функции quarterround(y). Функция quarterround(y) оперирует последовательностями из 4 слов.

Если y = (y0, y1, y2, y3), тогда quarterround(y) = (z0, z1, z2, z3), где z1 = y1 ((y0 + y3) <<< 7),

z2 = y2 ((z1 + y0) <<< 9), z3 = y3 ((z2 + z1) <<< 13), z0 = y0 ((z3 + z2) <<< 18).

Функцию quarterround можно представить как изменение y следующим образом: сначала y1 изменяется на z1, затем y2 изменяется на z2, затем y3 изменяется на z3, затем y0 изменяется на z0. Каждое изменение является обратимым, таким образом, вся функция является обратимой.

Функция rowround(y) оперирует последовательностями из 16 слов. Если y = (y0, y1, y2, y3, …, y15), тогда rowround(y) = (z0, z1, z2, z3, …, z15), где (z0, z1, z2, z3) = quarterround (y0, y1, y2, y3),

(z5, z6, z7, z4) = quarterround (y5, y6, y7, y4), (z10, z11, z8, z9) = quarterround (y10, y11, y8, y9),

(z15, z12, z13, z14) = quarterround (y15, y12, y13, y14).

Можно представить вход (y0, y1, …, y15) в виде квадратной матрицы:

y0y4y8y12

y1

y2

y3

 

y5

y6

y7

 

 

y

9

y

y

 

 

10

11

 

y

 

y

y

 

13

14

15

 

Функция rowround изменяет строки матрицы параллельно, пропуская перестановку каждой строки через функцию quarterround. В первой строке функция rowround изменяет y1, затем y2, затем y3, затем y0; во второй строке функция rowround изменяет y6, затем y7, затем y4,

182

затем y5; в третьей строке функция rowround изменяет y11, затем y8, затем y9, затем y10; в четвертой строке функция rowround изменяет y12, затем y13, затем y14, затем y15.

Функция columnround(x) также как и функция rowround(y) оперирует последовательностями из 16 слов.

Если x = (x0, x1, x2, x3, …, x15) тогда columnround(x) = (y0, y1, y2, y3, …, y15), где (y0, y4, y8, y12) = quarterround (x0, x4, x8, x12),

(y5, y9, y13, y1) = quarterround (x5, x9, x13, x1), (y10, y14, y2, y6) = quarterround (x10, x14, x2, x16), (y15, y3, y7, y11) = quarterround (x15, x3, x7, x11).

Эквивалентная формула: (y0, y4, y8, y12, y1, y5, y9, y13, y2, y6, y10, y14, y3, y7, y11, y15) = rowround(x0, x4, x8, x12, x1, x5, x9, x13, x2, x6, x10, x14, x3, x7, x11, x15).

Можно представить вход (x0, x1, …, x15) в виде квадратной матрицы:

x0x4x8x12

x1

x2

x3

 

x5

x6

x7

 

 

x

9

x

x

 

 

10

11

 

x

 

x

x

 

13

14

15

 

Функция columnround с этого ракурса представляется просто заменой (транспонированием) функции rowround. Функция columnround, изменяет столбцы матрицы параллельно, пропуская перестановку каждого столбца через функцию quarterround. В первом столбце, функция columnround изменяет y4, затем y8, затем y12, затем y0; во втором столбце, функция columnround изменяет y9, затем y13, затем y1, затем y5; в третьем столбце, функция columnround изменяет y14, затем y2, затем y6, затем y10; в четвертом столбце, функция columnround изменяет y3, затем y7, затем y11, затем y15.

Инициализация

Если ключ k – 32-байтовая или 16-байтовая последовательность, а iv – 16-байтовая последовательность, тогда Salsa20k(iv) является 64-байтовой последовательностью.

Определим 0 = (101, 120, 112, 97), 1 = (110, 100, 32, 51), 2 = (50, 45, 98, 121), и 3 = (116, 101, 32, 107). Если k0, k1, iv являются 16-байтовыми последовательностями, тогда

Salsa20k0,k1(iv) = Salsa20( 0, k0, 1, iv, 2, k1, 3).

Определим 0 = (101, 120, 112, 97), 1 = (110, 100, 32, 49), 2 = (54, 45, 98, 121), и 3 = (116, 101, 32, 107). Если k, iv являются 16-байтовыми последовательностями, тогда

Salsa20k(iv) = Salsa20( 0, k, 1, iv, 2, k, 3).

Константы 0 1 2 3 и 0 1 2 3, равны “expand 32-byte k” и “expand 16-byte k” (в ASCII) соответственно.

183