
Кодирование и шифрование информации в радиоэлектронных системах передачи информации. Часть 2. Шифрование
.pdf
Генерация ключевого потока
На каждом шаге, обновляется один элемент таблицы, и генерируется один 32-битовый блок выходной последовательности. S-блок используется для генерации только 512
выходных последовательностей, затем он обновляется за следующие 512 шага. Процесс генерации ключевой последовательности HC-128 описывается следующим псевдокодом
(рисунок 1).
i = 0; repeat {
j = i mod 512;
if (i mod 1024) < 512{
P[j] = P[j] + g1(P[j 3], P[j 10], P[j 511]);
si = h1(P[j 12]) P[j];
}
else {
Q[j] = Q[j] + g2(Q[j 3], Q[j 10], Q[j 511]);
si = h2(Q[j 12]) Q[j];
}
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 обозначает соответствующую переменную счетчика. Также есть один бит счетчика по переносу 7,i, который должен сохраняться/накапливаться между итерациями. Этот бит счетчика по переносу инициализируется путем обнуления. Восемь переменных состояния и восемь счетчиков формируются из ключа при инициализации.
161
Инициализация
Алгоритм инициализируется разворачиванием 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 1mod 8 |
|| k j , |
|
для четных j |
|
|
|
|
|
|| k j 4 mod 8 |
, |
|
|
|
|
k j 5 mod 8 |
|
для нечетных j |
|
|||
и |
|
|
|
|
|
|
|
x j ,0 |
k |
j 4 mod 8 |
|| k j 5 mod 8 |
, |
для четных j |
|
|
|
|
|
|
|
|
. |
|
|
k j || k j 1mod 8 , |
|
для нечетных j |
|
Чтобы уменьшить корреляцию между битами ключа и битами переменных внутреннего состояния система повторяется четыре раза, в соответствии с функцией следующего состояния, определенной ранее. Наконец, переменные счетчика повторно инициализируются согласно выражению:
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],
c5,4 = c5,4 (IV[63..48] || IV[31..16]),
162

c6,4 = c6,4 IV[63..32],
c7,4 = c7,4 (IV[47..32] || IV[15..0]).
Чтобы сделать все биты состояния нелинейно зависящими от всех битов IV система повторяется четыре раза. Модификация счетчика с помощью IV гарантирует, что все 264
различные вектора IV приведут к уникальным ключевым последовательностям.
Генерация ключевого потока
Ядром алгоритма 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. Перед каждой итерацией счетчики увеличиваются в соответствии с описанным ниже правилом.
Рис. 2.25. Графическое представление системы Работа счетчиков определяется следующим образом:
163
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 |
|
7,i |
232 |
j 0 |
||
|
|
0,i |
|
|
|
|
|
|
||
j ,i 1 |
åñëè c j ,i |
a j |
j 1,i 1 |
2 |
32 |
j 0 |
||||
1 |
|
|||||||||
|
|
|
|
|
|
|
|
|
|
|
|
0 |
во всех остальных |
случаях |
Кроме того, константы aj определены как: a0 = 0x4D34D34D, a1 = 0xD34D34D3,
a2 = 0x34D34D34, a3 = 0x4D34D34D, a4 = 0xD34D34D3, a5 = 0x34D34D34, a6 = 0x4D34D34D, a7 = 0xD34D34D3.
После каждой итерации результат извлекается следующим образом:
s |
15..0 x 15..0 x 31..16 , |
|
s |
31..16 |
x 31..16 |
x 15..0 , |
|
|||
|
i |
0,i |
5,i |
|
|
i |
|
0,i |
3,i |
|
s |
47..32 |
x 15..0 |
x 31..16 |
, |
s |
63..48 x 31..16 x 15..0 |
, |
|||
|
i |
2,i |
7,i |
|
|
|
i |
2,i |
5,i |
|
s |
79..64 |
x 15..0 |
x 31..16 |
, |
s |
95..80 x 31..16 x 15..0 |
, |
|||
|
i |
4,i |
1,i |
|
|
|
i |
4,i |
7,i |
|
s |
111..96 x 15..0 x 31..16 |
, |
s 127..112 x 31..16 x 15..0 . |
|||||||
|
i |
6,i |
3,i |
|
|
|
i |
6,i |
1,i |
|
Поточный шифр Salsa20
Ядром шифра Salsa20 является хеш-функция с 64-байтовым входом и 64-байтовым выходом [6]. Хеш-функция в режиме счетчика используется как поточный шифр: Salsa20
шифрует 64-байтовый блок открытого текста хешированием ключа, в данном случае, и
номера блока, складывая результат по модулю 2 (XOR) с открытым текстом.
Хеш-функция Salsa20
Хеш-функция Salsa20(x) определяется следующим выражением:
Salsa20(x) = x + doubleround10(x),
164
где каждая 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) в виде квадратной матрицы:
y0y4y8
y12
y |
y |
|
y |
|
|
|
|
1 |
|
2 |
|
3 |
|
y5 |
y6 |
y7 |
|
|||
y |
9 |
y |
|
y |
|
|
|
10 |
11 |
|
|||
y13 |
y14 |
|
|
|
||
y15 |
Функция rowround изменяет строки матрицы параллельно, пропуская перестановку каждой строки через функцию quarterround. В первой строке функция rowround изменяет y1,
затем y2, затем y3, затем y0; во второй строке функция rowround изменяет y6, затем y7, затем y4,
165
затем 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) в виде квадратной матрицы:
x0x4x8
x12
x |
x |
|
x |
|
|
|
|
1 |
|
2 |
|
3 |
|
x5 |
x6 |
x7 |
|
|||
x |
9 |
x |
|
x |
|
|
|
10 |
11 |
|
|||
x13 |
x14 |
|
|
|
||
x15 |
Функция 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)
соответственно.
166
Функция шифрования Salsa20
Пусть k – это 32или 16-байтовый секретный ключ, iv – 8-байтовый вектор инициализации, m – открытый текст. Тогда шифрование последовательности m шифром
Salsa20 с помощью вектор инициализации iv на ключе k, обозначается Salsa20k(iv) m –
шифрованный текст. Либо m может быть шифрованным текстом, в случае, когда Salsa20k(iv)m является исходным открытым текстом.
Поточный шифр SOSEMANUK
Sosemanuk – синхронный поточный шифр [6]. Шифр Sosemanuk использует принципы базовой конструкции поточного шифра SNOW 2.0 преобразования блочного шифра
SERPENT. Поэтому разработчики решили, что название этого шифра должно относиться и к SERPENT и к SNOW. Однако, известно, что снежных змей не существуют, т.к. змеи либо впадают в спячку, либо перемещаются в более теплые страны на зимы. С другой стороны Sosemanuk – популярный спорт, в который играют восточные канадские племена.
Он состоит в броске деревянной палки по сугробу как можно дальше. Его название на языке Cree означает snowsnake, так как палка на снегу похожа на змею. Kwakweco-cime win – вариант той же самой игры, но для названия шифра не походит.
Sosemanuk – синхронный поточный шифр, ориентированный на программную реализацию. Размер ключа варьируется между 128 и 256 битами. Утверждается, что при любой длине ключа достигается 128-битная безопасность. Sosemanuk стремится улучшить
SNOW 2.0 в двух отношениях. Во-первых, в Sosemanuk избегаются некоторые свойства структуры, которые могут проявиться как потенциальные слабости, даже если шифр
SNOW 2.0 с 128-битным ключом сопротивляется всем известным нападениям. Во-вторых,
эффективность улучшена относительно нескольких архитектур, уменьшением размера внутреннего состояния, таким образом допускается более прямое отображение данных относительно регистров процессора. Sosemanuk также требует меньшего количества статических данных; соответственно более низкого использования кэша данных, что приводит к лучшей работе на некоторых архитектурах. Другое достоинство Sosemanuk –
то, что его процедура установки ключа основана на сокращенной версии блочного шифра
SERPENT, улучшая классические процедуры инициализации и с точки зрения эффективности и с точки зрения безопасности.
SERPENT и его производные
SERPENT – блочный шифр, предложенный в качестве AES кандидата. SERPENT
работает с 128-битовыми блоками, которые разбиваются на четыре 32-разрядных слова, а
167
затем объединяются в так называемом “секционном” (“bitslice”) режиме. Таким образом
SERPENT может быть определен как шифр, работающий с четверкой 32-битовых слов. Мы нумеруем входные и выходные четверки SERPENT’а от 0 до 3, и пишем им в порядке: (Y3,
Y2, Y1, Y0). Y0 – самое младшее слово, содержащее младшие разряды 32-ух 4-битовых входных данных для S-блоков SERPENT’а. После того как выходной поток SERPENT’а
записывается в 16 байтов, в значения Yi записываются в соответствии со следующим условным обозначением littleendian (вначале самый младший байт), и сначала выводится Y0,
затем Y1, и так далее.
Из SERPENT разработчики определили два примитива по имени Serpent1 и Serpent24.
Циклы SERPENT’а состоят из:
добавления подключа поразрядным исключающим или (XOR);
применения s-блока, которое заключается в ряде поразрядных комбинаций между четырьмя обрабатываемыми 32-битовыми словами, в
секционном режиме (bitslice mode);
линейного биективного преобразования, которое равнозначно нескольким XOR’ам, сдвигам и циклическим сдвигам в секционном режиме
(bitslice mode).
Serpent1 – один раунд шифра SERPENT, без добавления ключа и линейного преобразования. SERPENT использует восемь различных S-блоков, пронумерованных от S0
до S7, рассчитанных на 4-битовые слова. Мы определяем Serpent1 как применение S2, в
секционном режиме (bitslice mode). Это третий S-блоковый уровень шифра SERPENT. Serpent1 использует в качестве входных данных четыре 32-битовых слова, и вырабатывает четыре 32-битовых слова в качестве выхода.
Serpent24 – это SERPENT, сокращенный до 24 раундов, вместо полной 32-х раундовой версии SERPENT. Serpent24 соответствует первым 24 раундам шифра SERPENT, причем последний (24-й) раунд полный – с линейным преобразованием и XOR’ом с 25-ым подключом. Другими словами, 24-ый раунд Serpent24 эквивалентен тридцать второму раунду шифра SERPENT, за исключением того, что содержит линейное преобразование и использует 24-ый и 25-ый подключи (32-ый и 33-ий подключи в SERPENT).
Соответствующее уравнение последнего раунда приведено в [32_Serpent]
|
|
|
|
|
|
|
R |
X L S 23 |
X K 23 |
|
|
K 24 |
|
23 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Serpent24 использует только 25 128-битовых подключей, которые являются первыми 25
подключами, производящимися в соответствии со схемой разворачивания ключа шифра
168
SERPENT. В Sosemanuk Serpent24 используется на этапе инициализации, только в режиме шифрования. При расшифровании не используется.
Инициализация
Процесс инициализации Sosemanuk разбит на два шага:
схема разворачивания ключа, которая подвергает обработке секретный ключ, но не зависит от вектора инициализации IV;
добавление вектора инициализации IV, которое использует выход схемы разворачивания ключа и вектор IV.
Таким образом, инициализируется внутреннее состояние поточного шифра.
Установка ключа соответствует схеме разворачивания ключа в Serpent24, которая производит 25 128-битовых подключей, как 100 32-битовых слова. Эти 25 128-битовых подключей идентичны первым 25 128-битовым подключам, производящимся в соответствии с простой схемой разворачивания ключа в SERPENT.
SERPENT допускает любую длину ключа длину от 1 до 256 битов; следовательно, Sosemanuk может работать с точно такими же ключами. Однако, так как Sosemanuk
стремится к 128-битовой безопасности, длина его ключа должна быть по крайней мере 128
битов. Поэтому, 128 битов – стандартная длина ключа. Поддерживается любая длина ключа от 128 битов до 256 битов. Но, уровень безопасности все же соответствует 128-битовой безопасности. Другими словами, использование более длинного секретного ключа не гарантирует обеспечение уровня безопасности, обычно ожидаемого от такого ключа.
Вектор IV является 128-битовым значением. Используется в качестве входа для блочного шифра Serpent24, инициализированный в соответствии со схемой разворачивания ключа. Serpent24 состоит из 24 раундов, используются выходы 12-го, 18-
го и 24-го раундов. Мы обозначим эти выоды следующим образом:
(Y312, Y212, Y112, Y012) – выход 12-ого раунда;
(Y318, Y218, Y118, Y018) – выход 18-ого раунда;
(Y324, Y224, Y124, Y024) – выход 24-ого раунда.
Выход каждого раунда состоит из четырех 32-битовых слов, берущихся только после линейного преобразования, за исключением 24-ого раунда, для которого выход берется только после добавления 25-ого подключа.
Эти значения используются для инициализации внутреннего состояния Sosemanuk’а со следующими значениями:
(s7, s8, s9, s10) = (Y312, Y212, Y112, Y012)
169
(s5, s6) = (Y118, Y318)
(s1, s2, s3, s4) = (Y324, Y224, Y124, Y024) R10 = Y018
R20 = Y218
Генерация ключевого потока
Для формирования выходных значений zt используется конечный автомат (FSM, Finite State Machine) и функция Serpent1.
Конечный автомат (FSM) – компонент с 64 битами памяти, аналогичный двум 32-
битовым регистрам R1 и R2. В каждом шаге FSM берет в качестве входных данных некоторые слова из состояния LFSR; обновляет биты памяти и производит 32-битовый выход. FSM оперирует состоянием LFSR в моменты времени t 1 следующим образом:
FSMt: (R1t–1, R2t–1, st+1, st+8, st+9) (R1t, R2t, ft)
где
R1t = (R2t–1 + mux(lsb(R1t–1), st+1, st+1
R2t = Trans(R1t–1)
ft = (st+9 + R1t mod 232) R2t
где lsb(x) – младший бит x,
mux(c, x, y) равен x если c = 0, или y если c = 1.
Внутренняя переходная функция Trans над полем F232 определяется как
Trans(z) = (M z mod 232)<<<7
где М – постоянное значение, равное 0x54655307 (шестнадцатеричное выражение первых десяти десятичных чисел π).
Выходы конечного автомата FSM группируются по четыре, и Serpent1 применяется к каждой группе; затем результат объединяется XOR’ом с соответствующими отбрасываемыми значениями LFSR, для производства выходных значений zt:
(zt+3, zt+2, zt+1, zt) = Serpent1(ft+3, ft+2, ft+1, ft) (st+3, st+2, st+1, st)
Четыре последовательных раунда Sosemanuk изображены на рисунке 2.26
170