Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Кодирование и шифрование информации в системах связи

..pdf
Скачиваний:
29
Добавлен:
05.02.2023
Размер:
20.43 Mб
Скачать

531

zi

Рис. 7.28. Краткий обзор шифра.

Шифр состоит из трех основных строительных блоков, а именно: LFSR, NFSR и

выходной функции. Содержимое LFSR обозначается si, si+1, …, si+127. Аналогичным образом содержание NFSR обозначается bi, bi+1, …, bi+127. Полином обратной связи LFSR,

обозначенный f(x), является примитивным полиномом степени 128. Он определен как

f(x) = 1 + x32 + x47 + x58 + x90 + x121 + x128.

Чтобы избежать любой возможной неопределенности, разработчики в [6] привели соответствующую функцию обновления LFSR:

si+128 = si + si+7 + si+38 + si+70 + si+81 + si+96.

Нелинейный полином обратной связи NFSR, g(x), является суммой одной линейной и одной нелинейной функций. Он определен как

g(x) = 1 + x32 + x37 + x72 + x102 + x128 + x44x60 + x61x125 + + x63x67 + x69x101 + x80x88 + x110x111 + x115x117.

Аналогично, чтобы избежать любой возможной неопределенности, разработчики также привели в [6] соответствующую функцию обновления NFSR. В функции обновления,

приведенной ниже, бит si, опущенный в полиноме обратной связи, включен и замаскирован со входом NFSR.

bi+128 = si + bi + bi+26 + bi+56 + bi+91 + bi+96 + bi+3bi+67 + bi+11bi+13 +

+ bi+17bi+18 + bi+27bi+59 + bi+40bi+48 + bi+61bi+65 + bi+68bi+84.

256 элементов памяти в этих двух сдвиговых регистрах представляют состояние шифра.

Из этого состояния берется 9 переменных в качестве входа булевой функции h(x). Два входа h(x) берутся из NFSR, а семь – из LFSR. Эта функция имеет степень 3 и является очень простой. Она определяется как

532

h(x) = x0x1 + x2x3 + x4x5 + x6x7 + x0x4x8,

где переменные x0, x1, x2, x3, x4, x5, x6, x7 и x8 соответствуют позициям сигнала bi+12, si+8, si+13, si+20, bi+95, si+42, si+60, si+79 и si+95 соответственно. Выходная функция определяется как

zi bi j h x si 93 ,

j A

где A = {2,15,36,45,64,73,89}.

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

Перед генерацией ключевой последовательности шифр должен быть инициализирован с помощью ключа и вектора IV. Пусть биты ключа k будут обозначаться ki, 0 i 127, а биты вектора IV будут обозначаться IVi, 0 i 95. Тогда инициализация ключа и вектора IV

выполняется следующим образом. 128 элементов NFSR заполняются битами ключа, bi = ki, 0i 127, затем первые 96 элементов LFSR заполняются битами IV битами, si = IVi, 0 i 95.

Последние 32 бита LFSR заполняются единицами, si = 1, 96 i 127. После загрузки битов ключа и IV, шифр тактируется 256 раз, без производства ключевой последовательности.

Вместо выходной функции производится подача назад и сложение по модулю 2 (XOR’тся) со входом и LFSR и NFSR, см. рисунок 7.29

Рис. 7.29. Инициализация ключа

Поточный шифр MICKEY-128

MICKEY-128 – поточный шифр, ориентированный на аппаратную реализацию. для генерации ключевого потока MICKEY-128 использует 128 битовый ключ [6]. Этот шифр использует нерегулярно тактируемые регистры сдвига с новыми методиками,

предназначенными обеспечить баланс между необходимостью в гарантированных

533

периоде и псевдослучайностью и необходимостью избежать определенных криптоаналитических атак.

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

MICKEY128 2.0 использует два входных параметра:

128-битовый секретный ключ K, биты которого обозначаются k0 k127;

вектор инициализации IV (initialisation variable), длиной от 0 до 128

битов, биты которой обозначаются iv0 ivIVLENGHT–1, где IVLENGHT – размер вектора инициализации в битах.

Генератор строится из двух регистров R и S. Каждый регистр длиной 160 разрядов. Биты в регистрах обозначаются r0 r159 и s0 s159 соответственно.

Разработчики заявляют, что R – это “линейный регистр”, а S – это “нелинейный регистр”.

Инициализация генератора начинается с обнуления всех разрядов регистров R и S. Затем производится загрузка вектора инициализации IV путем тактирования всего генератора

IVLENGHT раз с помощью операции clock_KG(R, S, Mixing = True, Input_bit = ivi),

описанной в п.1.3.8.2. Затем производится загрузка ключа: весь генератор тактируется 128

раз, так же с помощью операции clock_KG(R, S, Mixing = True, Input_bit = ki). Заканчивается процесс инициализации 160 кратным применением операции clock_KG(R, S, Mixing = True, Input_bit = 0) тактирования всего генератора.

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

После выполнения операции инициализации можно приступить к генерации битов ключевой последовательности z0 zL–1:

For 0 i L–1:

zi = r0 s0,

clock_KG(R, S, Mixing = False, Input_bit = 0),

где clock_KG(R, S, Mixing, Input_bit)и – операция тактирования всего генератора, которая определяется в соответствии со следующим псевдокодом:

Control_bit_R = s54 r106

Control_bit_S = s106 r53

If Mixing = True,

o clock_R(R, Input_bit_R = Input_bit s80, Control_bit_R = Control_bit)

oclock_S(S, Input_bit_S = Input_bit, Control_bit_S = Control_bit)

If instead Mixing = False,

oclock_R(R, Input_bit_R = Input_bit, Control_bit_R = Control_bit)

o clock_S(S, Input_bit_S = Input_bit, Control_bit_S = Control_bit)

534

clock_R и clock_S – это операции тактирования регистров R и S соответственно.

Операция тактирования регистра R clock_R(R, Input_bit_R, Control_bit_R) определяется следующим псевдокодом:

Пусть r0 r159 будет состоянием регистра R до тактирования, а r0

r159 будет состоянием регистра R после тактирования.

Feedback_bit = r159 Input_bit_R

For 1 i 159 {ri = ri–1; r0 = 0;}

For 0 i 159 {if i Rtaps, ri = ri Feedback_bit}

If Control_bit_R = 1

o For 0 i 159 {ri = ri ri}

Rtaps – это набор позиций отводов обратной связи для R:

Rtaps = {0, 4, 5, 8, 10, 11, 14, 16, 20, 25, 30, 32, 35, 36, 38, 42, 43, 46, 50, 51, 53, 54, 55, 56, 57, 60, 61, 62, 63, 65, 66, 69, 73, 74, 76, 79, 80, 81, 82, 85, 86, 90, 91, 92, 95, 97, 100, 101, 105, 106, 107, 108, 109, 111, 112, 113, 115, 116, 117, 127, 128, 129, 130, 131, 133, 135, 136, 137, 140, 142, 145, 148, 150, 152, 153, 154, 156, 157}.

Операция тактирования регистра S clock_S(S, Input_bit_S, Control_bit_S) определяется следующим псевдокодом:

Пусть s0 s159 будет состоянием регистра S до тактирования, а s0

s159 будет

состоянием

регистра

после тактирования. Также,

для упрощения

 

 

 

 

 

 

описания

шифра, мы

будем

использовать s0 s159 как

промежуточные

переменные.

Feedback_bit = s159 Input_bit_R

 

 

 

 

 

 

For 1 i 158 { si

= si–1 ((si comp0i)(si+1

comp1i)); si

= 0; s159 =

s158;}

 

 

 

 

If Control_bit_S = 0:

o For 0 i 159 {si = si (fb0i Feedback_bit)}

If instead Control_bit_S = 1

o For 0 i 159 {si = si (fb1i Feedback_bit)}

Значения comp0, comp1, fb0 и fb1, определенные разработчиками, приведены в [6].

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

Trivium – синхронный поточный шифр, использующий 80-битовый ключ и 80-

битовый вектор инициализации IV [6].

535

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

Алгоритм инициализируется загрузкой 80-битового ключа и 80-битового IV в 288-

битовое начальное состояние и устанавливает все оставшиеся биты в 0, за исключением s286, s287, и s288. Затем состояние изменяется за 4 полных цикла (без генерации бит ключевого потока). В итоге это можно представить в виде псевдокода, приведенного ниже:

(s1, s2, …, s93) (K1, …, K80, 0, …, 0) (s94, s95, …, s177) (IV1, …, IV80, 0, …, 0) (s178, s279, …, s288) (0, …, 0, 1, 1, 1) for i = 0 to 4 288 do

{

t1

 

s66

s91

s92

s93 s171

t2

 

s162

s175

s176

s177

s264

t3

 

s243

s286

s287

s288

s69

(s1, s2, …, s93) (t3, s1, …, s92)

(s94,

s95, …, s177) (t1, s94, …, s176)

(s178, s279, …, s288) (t2, s178, …, s287)

}

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

Предложенная конструкция содержит 288-битовое внутреннее состояние, обозначенное

(s1, …, s288). Генерация ключевого потока состоит из итерационного процесса, который извлекает значения 15 определенных битов состояния и использует их для обновления 3

битов состояния и вычисления 1 бита ключевого потока zi. Затем биты состояния циклически сдвигаются и процесс повторяет, пока не будут сгенерированы требуемые N бит ключевого потока. Полное описание дается следующим простым псевдокодом:

for i = 1 to N do

{

t1 s66 s93 t2 s162 s177

t3 s243 s288

zi t1 t2 t3

t1 t1 s91 s92 s171 t2 t2 s175 s176 s264 t3 t3 s286 s287 s69

(s1, s2, …, s93) (t3, s1, …, s92) (s94, s95, …, s177) (t1, s94, …, s176)

(s178, s279, …, s288) (t2, s178, …, s287)

}

Графическое представление процесса генерации ключевого потока приведено на рис.

2.30.

536

Рис. 7.30. Поточный шифр Trivium

Блочные шифры в поточных режимах

Российский блочный шифр ГОСТ 28147-89 в поточном режиме

В России в качестве стандарта шифрования принят алгоритм криптографического преобразования ГОСТ 28147-89. Этот алгоритм предназначен для аппаратной и программной реализации, удовлетворяет необходимым криптографическим требованиям и не накладывает ограничений на степень секретности защищаемой информации.

Для шифрования используются 256 битовый ключ, который разбивается на 8 32-

битовых подключа: K0, K1, …, K7, и таблица блока подстановки H. Заполнение таблиц блока подстановки H является долговременным ключевым элементом.

Алгоритм криптографического преобразования ГОСТ 28147-89 опирается на цикл шифрования (рисунок 7.31). Цикл шифрования построен по принципу сети Фейстеля.

537

N2

 

 

N1

 

 

 

 

 

 

 

 

 

 

L = N1 + Xj mod 232

 

 

Xj

 

 

m = 0, …, 7

Rm = Km(L)

R <<< 11

N2

 

N1

 

 

 

Рис. 7.31. Цикл шифрования

Один цикл шифрования преобразует 64-битовый блок данных, используя один 32-

битовый элемент ключа Kj и блок подстановки H.

Преобразуемый 64-битовый блок данных (N) разбивается на две части: старшую (N2) и

младшую (N1). Значение N1 суммируется по модулю 232 с одним из 32-битовых элементов ключа Kj, j = 0, …, 7. Результат суммирования преобразуется в блоке подстановки H. Блок подстановки H состоит из 8 узлов замены H1, …, H8 размером 64 бита каждый.

Поступающий на блок подстановки 32-разрядный блок разбивается на восемь последовательно идущих 4-разрядных блоков, каждый из которых преобразуется в 4-

разрядный блок соответствующим узлом замены, представляющим собой таблицу из шестнадцати строк, содержащих по четыре бита заполнения в строке. Входной блок определяет адрес строки в таблице, заполнение данной строки является выходным блоком. Затем 4-разрядные выходные блоки последовательно объединяются в 32-

разрядный блок. Полученное значение R циклически сдвигается на 11 шагов в сторону старших разрядов. Результат сдвига суммируется поразрядно по модулю 2 со значением

N2. Полученный результат N2 записывается в N1, при этом старое значение N1

переписывается в N2.

Многократное повторение цикла шифрования, при использовании различных элементов ключа, позволяет построить циклы зашифрования (32-З) и расшифрования (32-

Р). В цикле зашифрования 32-З отдельный цикл шифрования повторяется 32 раза,

538

используя 32-битовые элементы ключа в следующем порядке: K0, …, K7, K0, …, K7, K0, …,

K7, K7, …, K0. Цикл расшифрования 32-Р отличается от цикла порядком использования 32-

битовых элементов ключа. В цикле 32-Р этот порядок следующий: K0, …, K7, K7, …, K0,

K7, …, K0, K7, …, K0.

Ниже приведено описание двух поточных режимов работы криптографического алгоритма ГОСТ 28147-89, а именно: гаммирование и гаммирование с обратной связью.

Гаммирование

Криптосхема, реализующая алгоритм зашифрования в режиме гаммирования, имеет вид,

указанный на рисунке 7.32а.

 

 

 

N = S

 

 

 

 

 

N = S

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

N = Цикл 32-З(N )

 

 

 

 

 

N = Цикл 32-З(N )

 

 

i = 1, …, m

 

 

i = 1, …, m

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

N1=(N1+C2)mod 232

 

 

 

 

N1=(N1+C2)mod 232

 

 

 

 

N2=(N2+C1)mod(232–1)

 

 

 

 

N2=(N2+C1)mod(232–1)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

N = Цикл 32-З(N )

 

 

 

 

 

N = Цикл 32-З(N )

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Тоi

 

 

 

 

 

 

 

 

 

Тшi

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Тшi

 

 

 

 

 

 

Тоi

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

а)

 

 

 

 

б)

Рис. 7.32. Схема алгоритма зашифрования (а) и расшифрования (б) в режиме гаммирования

Открытые данные, разбитые на 64-разрядные блоки Тоi, зашифровываются в режиме гаммирования путем поразрядного суммирования по модулю 2 с гаммой шифра Гш, которая вырабатывается блоками по 64 бита Гшi, i = 1, …, m. m определяется объемом шифруемых данных. Число двоичных разрядов в блоке Тоm может быть меньше 64, при этом неиспользованная для зашифрования часть гаммы шифра из блока Гшm отбрасывается.

Для инициализации процесса генерации гаммы используется 64-разрядная двоичная последовательность (синхропосылка) S. К синхропосылке применяется цикл зашифрования

32-З. Результат шифрования N разбивается на две части: старшую (N2) и младшую (N1).

Значение N2 суммируется по модулю (232 – 1) с 32-разрядной константой C1 = 0101010416.

Значение N1 суммируется по модулю 232 с 32-разрядной константой C2 = 0101010116. К

полученному значению N применяется цикл зашифрования 32-З. Полученное в результате зашифрования значение N образует первый 64-разрядный блок гаммы шифра Гш1, который

539

суммируется поразрядно по модулю 2 с первым 64-разрядным блоком открытых данных То1.

В результате суммирования получается 64-разрядный блок зашифрованных данных Тш1. Для получения следующего 64-разрядного блока гаммы шифра Гш2 старшая часть N2 значения N

суммируется по модулю (232 – 1) с константой C1, а младшая часть N1 суммируется по модулю 232 с константой C2. К полученному значению применяется цикл зашифрования 32-З.

Полученное в результате зашифрования значение N образует второй 64-разрядный блок гаммы шифра Гш2, который суммируется поразрядно по модулю 2 со вторым блоком открытых данных То2. Аналогично вырабатываются блоки гаммы шифра Гш3, Гш4, …, Гшm и

зашифровываются блоки открытых данных То3, То4, …, Тоm. Если длина последнего m-го блока открытых данных Тоm меньше 64 бит, то из последнего m-го блока гаммы шифра Гшm

для зашифрования используется только соответствующее число разрядов гаммы шифра,

остальные разряды отбрасываются.

Аналогичным образом производится расшифрование в режиме гаммирования (рисунок

7.32б).

Гаммирование с обратной связью

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

Открытые данные, разбитые на 64-разрядные блоки Тоi, зашифровываются в режиме гаммирования с обратной связью путем поразрядного суммирования по модулю 2 с гаммой шифра Гш, которая вырабатывается блоками по 64 бита Гшi, i = 1, …, m. m определяется объемом шифруемых данных. Число двоичных разрядов в блоке Тоm может быть меньше 64.

N = S

N = S

i = 1, …, m

i = 1, …, m

N = Цикл 32-З(N )

N = Цикл 32-З(N )

Тоi

Тшi

N = Тшi

N = Тоi

а)

б)

Рис. 7.33. Схема алгоритма зашифрования (а) и расшифрования (б) в режиме гаммирования с обратной связью

Исходное значение – синхропосылка S зашифровывается с помощью цикла зашифрования 32-З. Полученное в результате зашифрования значение N образует первый 64-

разрядный блок гаммы шифра Гш1, который суммируется поразрядно по модулю 2 с первым

540

64-разрядным блоком открытых данных То1. В результате получается 64-разрядный блок зашифрованных данных Тш1.

Блок зашифрованных данных Тш1 одновременно является также исходным состоянием N

для выработки второго блока гаммы шифра Гш2 и по обратной связи передается на вход.

Новое значение N зашифровывается с помощью цикла зашифрования 32-З. Полученное в результате зашифрования значение N образует второй 64-разрядный блок гаммы шифра Гш2,

который суммируется поразрядно по модулю 2 со вторым блоком открытых данных То2.

Выработка последующих блоков данных шифра Гшi и зашифрование соответствующих блоков открытых данных Тоi (i = 3, …, m) производится аналогично. Если длина последнего m-го блока открытых данных Тоm меньше 64 бит, то из последнего m-го блока гаммы шифра

Гшm используется только соответствующее число разрядов гаммы шифра, остальные разряды отбрасываются.

Аналогичным образом производится расшифрование в режиме гаммирования с обратной связью (рисунок 7.33б).

Блочный шифр AES в поточном режиме

В основе стандарта шифрования AES лежит алгоритм Rijndael. Rijndael – это

итерационный блочный шифр, имеющий архитектуру “Квадрат”. Шифр имеет переменную длину блоков и различные длины ключей. Длина ключа и длина блока могут быть равны независимо друг от друга 128, 192 или 256 битам. В стандарте AES-128 определена длина блока данных, равная 128 битам.

Операции алгоритма AES выполнены на основе двумерного массива байтов,

называемого состоянием (state). Состояние состоит из четырех строк, каждая из которых содержит Nb байт, где Nb – длина блока в битах, деленная на 32. В массиве состояния,

обозначенном символом s, каждый байт имеет два индекса: номер строки r, 0 ≤ r < 4, и

номер столбца c, 0 ≤ c < Nb. Это позволяет обращаться к отдельному байту состояния как src.

Для AES-128 Nb = 4, т.е. 0 ≤ c < 4.

Перед применением операции зашифрования или расшифрования, входной блок данных,

представленный в виде массива байтов in0, …, in15, копируется в массив состояния (рисунок

2.34):

src = inr+4c, 0 ≤ r < 4, 0 ≤ c < Nb,

ав конце операций зашифрования или расшифрования, данные из состояния копируются

ввыходной массив (рисунок 2.34):

outr+4c = src, 0 ≤ r < 4, 0 ≤ c < Nb.

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