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

Практическая криптография алгоритмы и их программирование

.pdf
Скачиваний:
0
Добавлен:
08.09.2026
Размер:
2 Мб
Скачать
Глава 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 за значение развернутого ключа отвечает массив expan­ded_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).
i1
i1
).
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]