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

Процесс инициализации завершен, и шифр готов к генерации ключевой последовательности.

Генерация ключевого потока

На каждом шаге, обновляется один элемент таблицы, и генерируется один 32-битовый блок выходной последовательности. S-блок используется для генерации только 512 выходных последовательностей, затем он обновляется за следующие 512 шага. Процесс генерации ключевой последовательности HC-128 описывается следующим псевдокодом (рисунок 1).

i=0;

 

 

 

 

 

repeat{

 

 

 

 

j

i

 

 

 

 

 

=imod512;

 

 

 

if( mod1024)<512{

 

 

 

Pj Pj g Pj Pj Pj

511]);

 

[]= []+ ([ 3], [

10], [

 

 

 

1

Pj

 

 

 

s

 

h Pj

 

 

 

i

= ([ 12])

[];

 

 

 

 

1

 

 

 

}

 

 

 

 

 

else{

 

 

 

 

 

Qj Qj g Qj Qj Qj

511]);

 

[]= []+ ([ 3], [

10], [

 

 

 

2

Qj

 

 

 

s

 

h Qj

 

 

 

i

= ([ 12])

[];

 

 

 

 

2

 

 

 

}

i=i+1;

}

Рисунок 1. Псевдокод генерации ключевой последовательности

si – 32-битовый выходной блок на i-м шаге процесса генерации ключевой последовательности.

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

Алгоритм Rabbit в качестве входных данных использует 128-битовый секретный ключ и, если необходимо, 64-битовый вектор IV [6]. За одну итерацию генерирует блок 128 псевдослучайных бит. Шифрование/расшифрование производится путем сложения по модулю 2 (XOR) сгенерированной псевдослучайной последовательности с открытым/зашифрованным текстом. Размер внутреннего состояния – 513 бит, поделенных между восьмью 32-разрядными переменными состояния, восьмью 32-разрядными счетчиками и одним битом переноса. Эти восемь переменных состояния обновляются посредством восьми парных нелинейных функций. Счетчики гарантируют нижнюю границу на длине периода для переменных состояния.

Внутреннее состояние поточного шифра состоит из 513 битов. 512 битов разделены между восьмью 32-разрядными переменными состояния xj,i и восьмью 32-разрядными переменными счетчика cj,i, где xj,i – переменная состояния j-ой подсистемы в i-ой итерации, а cj,i обозначает соответствующую переменную счетчика. Также есть один бит счетчика по

178

переносу 7,i, который должен сохраняться/накапливаться между итерациями. Этот бит счетчика по переносу инициализируется путем обнуления. Восемь переменных состояния и восемь счетчиков формируются из ключа при инициализации.

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

Алгоритм инициализируется разворачиванием 128-битового ключа в восемь переменных состояния и восемь счетчиков так, что есть взаимно однозначное соответствие между ключом и переменными начального состояния xj,i и начальными значениями счетчиков cj,i.

Ключ K[127.. 0] разделен на восемь 16-битовых подключей:

k0 = K[15..0], k1 = K[31..16], …, k7 = K[127..112].

Переменные состояния и счетчика инициализируются из подключей следующим образом:

x j,0

k j 1mod8

|| k j ,

для четных j

 

 

|| k j 4 mod8 ,

для нечетных j

 

 

k j 5 mod8

 

и

 

 

 

 

x j,0

k j 4 mod8

|| k j 5 mod8 ,

для четных j

.

 

 

для нечетных j

 

k j || k j 1mod8 ,

 

Чтобы уменьшить корреляцию между битами ключа и битами переменных внутреннего состояния система повторяется четыре раза, в соответствии с функцией следующего состояния, определенной ранее. Наконец, переменные счетчика повторно инициализируются согласно выражению:

cj,4 = cj,4 x(j+4 mod 8),4

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

Обозначим внутреннее состояние после применения схемы установки ключа как основное состояние. Пусть копия этого основного состояния будет изменена в соответствии со схемой установки IV. Схема установки IV изменяет состояние счетчика как функция IV. Это реализуется путем применения операции XOR к 64-битовым IV и всеми 256 битами состояния счетчика. 64 бита IV обозначаются IV[63..0]. Счетчики изменяются следующим образом:

c0,4 = c0,4 IV[31..0],

c1,4 = c1,4 (IV[63..48] || IV[31..16]), c2,4 = c2,4 IV[63..32],

c3,4 = c3,4 (IV[47..32] || IV[15..0]), c4,4 = c4,4 IV[31..0],

179

c6,4 = c6,4 IV[63..32],
c7,4 = c7,4 (IV[47..32] || IV[15..0]).
Чтобы сделать все биты состояния нелинейно зависящими от всех битов IV система повторяется четыре раза. Модификация счетчика с помощью IV гарантирует, что все 264 различные вектора IV приведут к уникальным ключевым последовательностям.
Генерация ключевого потока
c5,4 = c5,4 (IV[63..48]

|| IV[31..16]),

Ядром алгоритма Rabbit является повторение функции выработки следующего состояния, определенной уравнениями:

x0,i+1 = g0,i + (g7,i <<< 16) + (g6,i <<< 16),

x1,i+1 = g1,i + (g0,i <<< 8) + g7,i,

x2,i+1 = g2,i + (g1,i <<< 16) + (g0,i <<< 16),

x3,i+1 = g3,i + (g2,i <<< 8) + g1,i,

x4,i+1 = g4,i + (g3,i <<< 16) + (g2,i <<< 16),

x5,i+1 = g5,i + (g4,i <<< 8) + g3,i,

x6,i+1 = g6,i + (g5,i <<< 16) + (g4,i <<< 16),

x7,i+1 = g7,i + (g6,i <<< 8) + g5,i,

gj,i = ((xj,i + cj,i+1)2 ((xj,i + cj,i+1)2 >> 32)) mod 232,

где все операции сложения приводятся по модулю 232. Эта двойная система приведена на рисунке 2.25. Перед каждой итерацией счетчики увеличиваются в соответствии с описанным ниже правилом.

180