Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Практическая криптография алгоритмы и их программирование
.pdf
Глава 4. Как устроены современные шифры 121
// вычисляем инвертированные цикловые константы
rndcon_gen(0xB1B1, &rcon);
// проводим 11 раундов шифрования
mu(a);
for (i = 0; i < 11; i++) {
a[0] ^= ki[0] ^ (rcon[i] << 16);
a[1] ^= ki[1];
a[2] ^= ki[2] ^ rcon[i];
rho(a);
}
a[0] ^= ki[0] ^ (rcon[11]<<16);
a[1] ^= ki[1];
a[2] ^= ki[2] ^ rcon[11];
theta(a);
mu(a);
}
Шифр SQUARE, так же как и 3-WAY, состоит из композиции нескольких
простых шифрующих преобразований, то есть является составным шифром. Авторы описывают криптографические примитивы как «слои», которые накладываются один на другой и «закрывают» данные. Для этого в SQUARE, так же как и в
3-WAY, используются следующие типы преобразований: линейное, нелинейное,
перестановка байтов и побитное сложение с подключом.
Достоинством шифра SQUARE является тот факт, что все вышеописанные
преобразования сводятся к довольно простым операциям, которые могут быть
эффективно реализованы на современных процессорах и компьютерных системах. При этом с использованием этой архитектуры можно добиться высокой
степени распараллеливания вычислений. Это качество одновременно является
и хорошим, и плохим. Его положительная сторона заключается в возможности
эффективной реализации шифра на многопроцессорных системах для обработки огромных массивов данных или, например, в глобальных сетях. А отрицательная очевидна в силу причин, о которых будет рассказано в разделе «Дешифрование DES».
Отрицательные и положительные стороны архитектуры были учтены участниками жюри Национального института стандартов и технологий при выборе нового стандарта шифрования США. Дело в том, что начиная с 1977 года,
после принятия первого стандарта шифрования данных, НИСТ каждые пять
лет вновь подтверждал DES в качестве национального стандарта шифрования. После целого ряда удачных взломов шифра DES (см. главу «Дешифрование современных шифров») был инициирован проект создания стандарта симметричного шифрования. С 1997 года, когда сообщение об этом опубликовали в федеральном реестре США, было организовано и проведено три этапа
рассмотрения, анализа и обсуждения шифров, представленных на объявленный конкурс.
На первом этапе, завершившемся в 1998 году, было принято решение о приеме для рассмотрения 15 потенциальных кандидатов на титул национального стандарта. При отборе оценивались: защищенность алгоритмов от криптоаналитиче
-

122 Глава 4. Как устроены современные шифры
ских атак, статистические характеристики шифров; простота и надежность математической базы; вычислительная сложность алгоритмов зашифрования и
расшифрования, разворачивания ключей; сложность и эквивалентность программной и аппаратной реализаций; возможность использования различных размеров
блоков данных и длин ключей.
В соответствии с этими критериями на втором этапе были отсеяны почти
25
все кандидаты, кроме четырех наилучших: RIJNDAEL
, MARS, RC6, TWOFISH
и SERPENT. В итоге в конце третьего, завершающего этапа конкурса члены
жюри отдали большинство голосов (из более чем 200 членов жюри 86 проголосовало «за») первому кандидату — шифру RIJNDAEL, авторами которого являются Joan Daemen и Vincent Rijmen. С этого момента новый стандарт шифрования RIJNDAEL в прессе упоминают не иначе как Advanced Encryption Standard
или AES.
Как блочный итеративный шифр, AES зашифровывает данные блоками фиксированного (на время исполнения) размера размером по 128, 192 или 256 битов.
Возможные длины ключа равны соответственно 128, 192 и 256 битам. Для зашифрования данных вырабатываются цикловые подключи (здесь понятия цикла и раунда совпадают) с помощью специального алгоритма разворачивания — «образования подключей» (key evolution). При этом их количество на единицу больше
числа исполняемых раундов зашифрования.
Число раундов зависит от размеров блока и длины ключа в следующем виде
(рис. 4.14).
Число раундов
Длина ключа
в байтах = 16
Длина ключа
в байтах = 24
Длина ключа
в байтах = 32
Длина блока
в байтах = 16
10 12 14
12 12 14
14 14 14
Ðèñ. 4.14
Длина блока
в байтах = 24
Длина блока
в байтах = 32
Каждый раунд можно описать с помощью четырех основных шагов (см. листинг 4.25):
Листинг 4.25
1. Нелинейная подстановка;
2. Строковый сдвиг;
3. Перемешивание столбцов;
4. Суммирование с цикловым подключом.
25
Название RIJNDAEL произносится как «Райндэл» и является, по всей видимости, произ
водным от фамилий его авторов.
-

Глава 4. Как устроены современные шифры 123
Перед тем как вдаваться в описание перечисленных этапов шифрования, необходимо отметить несколько нестандартное представление данных в алгоритме
шифрования. Текущее состояние шифра в нем представляется не в виде битовой
строки определенной длины, а в виде матрицы 8-битовых байтов. Например, для
длины блока в 128 битов и такой же длины ключа матрица состояния будет выглядеть вот так:
kkkk
,,,
00 01 02 03
,,,,
kkkk
,,,
10 11 12 13
,,,,
kkk
,,
20 21 2
,,
,,,
kkkk
,,,,
30 31 32 33
,
k
,,
223
Матрица состояния:
aaaa
,,,
00 01 02 03
,,,,
aaaa
,,,
10 11 12 13
,,,,
aaa
,,
20 21 2
,,
,,,
aaaa
,,,,
30 31 32 33
,
a
,,
223
Êëþ÷:
Эту матрицу называют текущим состоянием шифра или просто матрицей состояния. Нелинейная подстановка представляет собой применение узлов замены
для каждого из байтов текущей матрицы состояния. Для ее реализации используют два примитивных преобразования: получают обратное по умножению к значению байта в матрице по модулю 2
8
, а затем применяя умножение на фиксирован-
ную матрицу и сложение с вектором:
y
0
y
1
y
2
y
3
y
4
y
5
y
6
y
7
⋅ ⋅ ⋅ ⋅⋅⋅⋅
10001
⋅⋅ ⋅ ⋅ ⋅⋅⋅
11 0 0 0111
⋅⋅⋅⋅⋅⋅⋅
111 0 0 011
⋅⋅⋅⋅⋅⋅⋅
1111 0 0 01
=
11111 0 0 0
⋅⋅⋅⋅⋅ ⋅ ⋅
011111 0 0
⋅⋅⋅⋅⋅⋅ ⋅
0 0 11111 0
⋅ ⋅⋅⋅⋅⋅⋅
00
⋅⋅011111
⋅⋅⋅⋅⋅
111
x
x
x
x
x
x
x
x
1
0
1
1
0
2
0
3
.
+
0
4
5
6
7
1
1
0
Подобные матрицы называются теплицевыми матрицами, на любой их диагонали стоит один и тот же элемент. Наглядно данное преобразование переводит
одни байты используемой матрицы состояния в другие, независимо друг от друга
(см. рис. 4.15, где показано изменение байтов матрицы À и порядок перевода их
значений в матрицу B).
Ðèñ. 4.15

124 Глава 4. Как устроены современные шифры
Затем в действие вступает второй этап — строкой сдвиг матрицы состояния.
На этом этапе из матрицы делает своего рода циркулянт, сдвигая циклически элементы каждой строки на определенное количество позиций. В 128-битовом варианте первая строка (сверху вниз) не сдвигается вообще, вторая сдвигается на
один элемент, третья — на два, а четвертая — на три элемента (4.16).
Ðèñ. 4.16
Следующим этапом становится перемешивание столбцов матрицы состояния
с помощью умножения на фиксированный полином c(x) = a
x3+ x2+ x + a2, ãäå a
3
è a2— такие заранее заданные константы, что полином c(x) взаимно прост с выбранным неприводимым полиномом и вследствие этого обратим. Обратный поли-
−1
íîì c
(x) используется на этом же этапе для расшифрования. Для этого столбцы
матрицы состояния представляются в виде полиномов с коэффициентами над по-
8
ëåì GF(2
) и умножаются на c(x). Вся операция b(x) = a(x)c(x) может быть легко
записана в матричном виде:
3
b
b
b
b
0
1
=
2
3
2311
1231
1123
3112
a
0
a
1
.
a
2
a
3
Схема производимых изменений в матрице состояний представлена на
рис. 4.17.
Ðèñ. 4.17
Последним этапом является сложение всех элементов матрицы состояния с
элементами текущего подключа a
+ kij= bij(ðèñ. 4.18).
ij

Глава 4. Как устроены современные шифры 125
Ðèñ. 4.18
Соответственно описанным выше преобразованием для полного описания
шифра не хватает описания «эволюции ключей», то есть операции разворачивания цикловых подключей из исходного ключа.
В реализации алгоритма исходный ключа разворачивается в «развернутый»,
который представляет собой обычный массив, состоящий из 32-битовых слов.
Если число раундов шифра обозначить через Nr, а число байтов в ключе через
Nk, то размер массива определяется как (Nr + 1) ⋅ Nk. При этом первые Nk байты
в массиве занимают исходный ключ, а остальные вычисляются с помощью следу-
26
ющего алгоритма (см. листинг 4.26)
Листинг 4.26
for(i=Nk;i<Nk*(Nr+1);i++) {
temp = expanded_key[i - 1];
if(i%Nk==0)
temp = do_sbox(do_rotate(temp)) ^ r_const[i / Nk];
expanded_key[i] = expanded_key[i - Nk] ^ temp;
}
.
В листинге 4.26 за значение развернутого ключа отвечает массив expanded_key[], а переменная temp играет роль временного буфера для перевода и обработки значений его элементов. В качестве r_const выступают специальные цикловые константы, не зависящие от ключа. Их вычисляют заранее по рекуррентным формулам:
r_const[1] = 1,
r_const[2] = x,
r_const[3] = x
...
r_const[i] = x (r_const[i-1]) = x
2
,
(i-1)
Реализация шифрующих преобразований аналогична реализациям для
3-WAY и SQUARE. Не намного усложненные конструкции отображений также
легко реализуются с помощью табличных преобразований (для умножения в поле
8
GF(2
), например), сдвигов и побитного суммирования (см. листинг 4.27).
26
Алгоритм разворачивания ключа в общем случае зависит от длины используемого клю
ча, а не только от количества раундов. Чтобы упростить изложение, мы приводим здесь описа
ние алгоритма только для длин ключа меньше либо равных 192 битам.
-
-

126 Глава 4. Как устроены современные шифры
Листинг 4.27
// умножение двух элементов в поле GF(256)
uint8_t mul(uint8_t a, uint8_t b) {
if (a && b)
return Alogtable[(Logtable[a] + Logtable[b]) % 255];
else
return 0;
}
// сложение с подключом
void KeyAddition(uint8_t a[4][4], uint8_t rk[4][4]) {
for(inti=0;i<4;i++)
for(intj=0;j<4;j++)
a[i][j] ^= rk[i][j];
}
// строковый сдвиг
void ShiftRow(uint8_t a[4][4], uint8_t d) {
uint8_t tmp[4];
int i, j;
for(i=1;i<4;i++) {
for(j=0;j<4;j++) tmp[j] = a[i][j + shifts[i][d];
for(j=0;j<4;j++) a[i][j] = tmp[j];
}
}
// узел замены
void Substitution(uint8_t a[4][4], uint8_t box[256]) {
int i, j;
for(i=0;i<4;i++)
for(j=0;j<4;j++) a[i][j] = box[a[i][j]];
}
// перемешивание столбцов
void MixColumn(uint8_t a[4][4]) {
uint8_t b[4][4];
int i, j;
for(j=0;j<4;j++)
for(i=0;i<4;i++)
b[i][j] = mul(2,a[i][j])
^ mul(3,a[(i + 1) % 4][j])
^ a[(i + 2) % 4][j]
^ a[(i + 3) % 4][j];
for(i=0;i<4;i++)
for(j=0;j<4;j++) a[i][j] = b[i][j];
}
Все операции производятся с использованием специальных таблиц (см. лис-
тинг 4.28). Обратите внимание на способ вычисления произведения в поле
8
).
GF(2

Глава 4. Как устроены современные шифры 127
Листинг 4.28
uint8_t Logtable[256] = {
0, 0, 25, 1, 50, 2, 26, 198, 75, 199, 27, 104, 51, 238, 223, 3,
100, 4, 224, 14, 52, 141, 129, 239, 76, 113, 8, 200, 248, 105, 28, 193,
125, 194, 29, 181, 249, 185, 39, 106, 77, 228, 166, 114, 154, 201, 9, 120,
101, 47, 138, 5, 33, 15, 225, 36, 18, 240, 130, 69, 53, 147, 218, 142,
150, 143, 219, 189, 54, 208, 206, 148, 19, 92, 210, 241, 64, 70, 131, 56,
102, 221, 253, 48, 191, 6, 139, 98, 179, 37, 226, 152, 34, 136, 145, 16,
126, 110, 72, 195, 163, 182, 30, 66, 58, 107, 40, 84, 250, 133, 61, 186,
43, 121, 10, 21, 155, 159, 94, 202, 78, 212, 172, 229, 243, 115, 167, 87,
175, 88, 168, 80, 244, 234, 214, 116, 79, 174, 233, 213, 231, 230, 173, 232,
44, 215, 117, 122, 235, 22, 11, 245, 89, 203, 95, 176, 156, 169, 81, 160,
127, 12, 246, 111, 23, 196, 73, 236, 216, 67, 31, 45, 164, 118, 123, 183,
204, 187, 62, 90, 251, 96, 177, 134, 59, 82, 161, 108, 170, 85, 41, 157,
151, 178, 135, 144, 97, 190, 220, 252, 188, 149, 207, 205, 55, 63, 91, 209,
83, 57, 132, 60, 65, 162, 109, 71, 20, 42, 158, 93, 86, 242, 211, 171,
68, 17, 146, 217, 35, 32, 46, 137, 180, 124, 184, 38, 119, 153, 227, 165,
103, 74, 237, 222, 197, 49, 254, 24, 13, 99, 140, 128, 192, 247, 112, 7,
};
uint8_t Alogtable[256] = {
1, 3, 5, 15, 17, 51, 85, 255, 26, 46, 114, 150, 161, 248, 19, 53,
95, 225, 56, 72, 216, 115, 149, 164, 247, 2, 6, 10, 30, 34, 102, 170,
229, 52, 92, 228, 55, 89, 235, 38, 106, 190, 217, 112, 144, 171, 230, 49,
83, 245, 4, 12, 20, 60, 68, 204, 79, 209, 104, 184, 211, 110, 178, 205,
76, 212, 103, 169, 224, 59, 77, 215, 98, 166, 241, 8, 24, 40, 120, 136,
131, 158, 185, 208, 107, 189, 220, 127, 129, 152, 179, 206, 73, 219, 118, 154,
181, 196, 87, 249, 16, 48, 80, 240, 11, 29, 39, 105, 187, 214, 97, 163,
254, 25, 43, 125, 135, 146, 173, 236, 47, 113, 147, 174, 233, 32, 96, 160,
251, 22, 58, 78, 210, 109, 183, 194, 93, 231, 50, 86, 250, 21, 63, 65,
195, 94, 226, 61, 71, 201, 64, 192, 91, 237, 44, 116, 156, 191, 218, 117,
159, 186, 213, 100, 172, 239, 42, 126, 130, 157, 188, 223, 122, 142, 137, 128,
155, 182, 193, 88, 232, 35, 101, 175, 234, 37, 111, 177, 200, 67, 197, 84,
252, 31, 33, 99, 165, 244, 7, 9, 27, 45, 119, 153, 176, 203, 70, 202,
69, 207, 74, 222, 121, 139, 134, 145, 168, 227, 62, 66, 198, 81, 243, 14,
18, 54, 90, 238, 41, 123, 141, 140, 143, 138, 133, 148, 167, 242, 13, 23,
57, 75, 221, 124, 132, 151, 162, 253, 28, 36, 108, 180, 199, 82, 246, 1,
};
static word8 shifts[4][2] = {
0, 0,
1, 3,
2, 2,
3, 1,
};
Большинство вычислительных операций, отнимающих много времени на исполнение, можно заменить на аналогичные, более эффективные в каждом конкретном случае. Например, вычисления остатка от деления на 4, выполненное в
виде операции x%4наязыке Си, в несколько раз медленнее, чем ее аналог в

128 Глава 4. Как устроены современные шифры
виде x & 3. Это связано с тем, что сложные операции деления и умножения в десятки раз медленнее простых битовых операций, наподобие логического &/AND.
Именно этот вид технической оптимизации можно провести для исходного
текста из листинга 4.29, содержащего полную реализацию функции разворачивания ключа, уже анонсированную и описанную в одном из предыдущих листингов.
Впрочем, оставим эту задачу в качестве легкого упражнения заинтересованному
читателю.
Листинг 4.29
// разворачиваем ключ
void setup_AES(AES_KEY *k, uint8_t W[12][4][4]) {
int i, j, t, rconpointer = 0;
uint8_t tk[4][4];
// временно сохраняем ключ
for(j=0;j<4;j++)
for(i=0;i<4;i++)
tk[i][j] = k[i][j];
// подготавливаем первый подключ
for(j = 0; (j < 4) && (t < 12*4); j++, t++)
for(i=0;i<4;i++) W[t / 4][i][t % 4] = tk[i][j];
t=0;
while (t < 12*4) {
// вычисляем каждый из 11(количество раундов)+1 ключей
for(i=0;i<4;i++)
tk[i][0] ^= S[tk[(i+1) % 4][4-1]];
// остаток от деления на 4
// можно с успехом заменить на операцию И:a%4==a&0x3
tk[0][0] ^= rcon[rconpointer++]; // цикловые константы
for(j=1;j<4;j++)
for(i=0;i<4;i++) tk[i][j] ^= tk[i][j-1];
// сохраняем вычисленные значения
for(j = 0; (j < 4) && (t < 12*4); j++, t++)
for(i=0;i<4;i++) W[t / 4][i][t % 4] = tk[i][j];
}
}
Алгоритм зашифрования, как уже было сказано, содержит в себе использование всех описанных выше преобразований. Однако от других архитектур построения шифров, архитектуру SQUARE отличает то, что она не является симметричной в полном смысле этого слова. Для того чтобы реализовать расшифрование
блока данных, необходимо поменять порядок вычисления используемых отображений, а также следить за тем, чтобы вместо отображений, для которых обратное
не совпадает с прямым, применялись именно обратные.

Глава 4. Как устроены современные шифры 129
Листинг 4.30
// зашифровываем или расшифровываем один блок данных
void enc_AES(uint32_t block[4][4], uint8_t rk[MAXROUNDS+1][4][4], bool encrypt) {
if (encrypt) {
KeyAddition(a, rk[0]);
for(intr=1;r<ROUNDS; r++) {
Substitution(a,S);
ShiftRow(a,0);
MixColumn(a);
KeyAddition(a,rk[r]);
}
Substitution(a,S);
ShiftRow(a,0);
KeyAddition(a,rk[ROUNDS]);
}
else {
KeyAddition(a,rk[ROUNDS]);
Substitution(a,Si);
ShiftRow(a,1);
for(r = ROUNDS-1;r>0;r--) {
KeyAddition(a,rk[r]);
InvMixColumn(a);
Substitution(a,Si);
ShiftRow(a,1);
}
KeyAddition(a,rk[0]);
}
}
Отличные от прямых обратные преобразования имеют отображение-подстановку (узел замены), перестановку столбцов и строковый сдвиг. Сложение с подключом этой особенностью не обладает.
Режимы шифрования
При зашифровании более чем одного блока информации можно воспользоваться различными способами связи блоков друг с другом. Представьте на минуту, что перед нами поставлена задача шифрования некоторого объема данных. Если мы будем зашифровывать его с помощью блочного шифра, то встретимся сразу с двумя проблемами. Первая из них заключается в том, что
одинаковые блоки открытого текста будут отображены шифром в одинаковые
блоки шифротекста и при не слишком больших размерах блока и достаточной
длине шифротекста будет возможно проведение даже простейшего метода частотного анализа. А вторая связана с тем, что криптоаналитик, даже не обладающей никакой информацией о ключе шифра, но перехвативший шифровку, может беспрепятственно и совершенно незаметно переставлять блоки шифротекста местами, зачастую меняя смысл передаваемой информации коренным
образом.

130 Глава 4. Как устроены современные шифры
По этой причине для зашифрования информации было выработано несколько
специальных режимов обработки различных объемов данных. Каждый из этих режимов связан с той или иной областью применения и гарантирует определенную
степень защиты от той или иной криптоаналитической угрозы.
Для первых стандартов шифрования DES и ГОСТ были предусмотрены всего
четыре режима шифрования:
режим Простой Замены (ÐÏÇ) — Electronic Codebook (ECB);
•
режим Выработки Имитовставки (ÂÈÂ) — Cipher Block Chaining
•
(CBC);
режим Обратной Связи по Выходу (ÎÑÂ) — Output Feedback (OFB)27;
•
режим Гаммирования с Обратной Связью (ÃÎÑ) — Cipher Feedback
•
(CFB).
Через три года после принятия первого стандарта, регламентирующего их использование в США, комитет ANSI (Национальный Американский Институт
Стандартов) принял еще один документ, описывающий еще один — пятый режим
шифрования: Режим Гаммирования (ÐÃ) — Counter Mode (CM).
Режим Простой Замены/ECB. В режиме простой замены блок открытого
текста P
зашифровывается независимо от остальных блоков:
i
Зашифрование: C
Расшифрование: P
= Ek(Pi).
i
= Dk(Ci).
i
Режим Выработки Имитовставки/CBC. Режим выработки имитовставки
предназначен для зашифрования и выработки специального хэш-значения, по которому возможно осуществить контроль несанкционированной модификации данных, переданных по открытому каналу связи. В качестве самого первого блока на
вход шифра подается значение синхропосылки — открытый случайный блок данных, известный как абонентам шифрованной связи, так и потенциальному криптоаналитику. Синхропосылка может передаваться вместе с зашифрованными данными и должна быть различной для каждого сеанса. Последний блок выхода является ключезависимой нелинейной функцией от всех блоков зашифрованных
данных. Это свойство позволяет использовать значение последнего блока в качестве штамма аутентификации переданных данных.
В соответствии с американскими стандартами этот режим может применяться как для шифрования, так и для аутентификации данных. Отечественный же
стандарт регламентирует использование этого режима только для выработки имитовставки — специального значения кода аутентификации, поскольку в соответствии с ГОСТ для этой цели применяется функция шифрования с сокращенным
вдвое числом раундов:
= синхропосылка.
C
0
Зашифрование: C
Расшифрование: P
27
В стандарте в соответствии с ГОСТ 28147-89 такой режим шифрования отсутствует.
= Ek(Pi⊕ C
i
= C
i
⊕ Dk(Ci).
i−1
i−1
).
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
