- •Введение
- •Глава 1. Основные понятия и определения
- •1.1. Основные понятия
- •1.2. Типы атак
- •1.3. Параметры симметричных шифров
- •1.4. Режимы шифрования
- •1.4.1 Режим кодовой книги (ECB)
- •1.4.2 Режим с зацеплением блоков (CBC)
- •1.5. Принципы построения шифров
- •Глава 2. Исторические шифры
- •2.1. Шифры перестановки
- •Пример (шифр Древней Спарты)
- •2.2. Шифры замены (подстановки)
- •2.2.1 Шифры простой замены
- •Пример (шифр Юлия Цезаря)
- •Пример (аффинное преобразование)
- •2.2.2 Многосимвольный подстановочный шифр
- •Пример (шифр Playfair, изобретенный в 1854 году)
- •2.2.3 Шифры гомоморфной замены
- •Глава 3. Сети Файстела и другие шифры
- •3.1. Сети Файстела (Feistel)
- •3.2. Шифр Люцифер
- •3.3. Алгоритм DES
- •3.3.1 Слабые и полу-слабые ключи в DES
- •3.3.2 Использование метода разностного криптоанализа для DES
- •3.4. Алгоритм шифрования FEAL
- •Основные различия между DES и ГОСТ
- •3.6. Алгоритм IDEA
- •3.7. Алгоритм Blowfish
- •Подключи
- •Шифрование и дешифрация
- •Генерирование множеств подключей
- •3.8. Алгоритм RC5
- •Глава 4. AES-кандидаты
- •4.1. Алгоритм MARS
- •Первый этап: прямое перемешивание
- •"Криптографическое ядро"
- •Обратное перемешивание
- •Процедура генерации ключей
- •Построение S-box
- •4.2. Алгоритм RC6
- •Генерация ключей
- •4.3. Алгоритм Serpent
- •Создание S-box
- •Линейное преобразование
- •Генерация ключей
- •4.4. Алгоритм Rijndael
- •1. Побайтовая подстановка
- •2. Сдвиг по строке
- •3. Побайтовая перестановка внутри столбцов
- •4. Сложение с ключом, используемым на данном этапе
- •Процедура получения ключей для каждого этапа алгоритма шифрования
- •Алгоритм расширения ключа
- •4.5. Алгоритм Twofish
- •Функция
- •Преобразование
- •Генерация ключей
- •Функция
- •Функция генерации ключей
- •Примечание
- •Литература
- •Приложение 1. S-box шифра MARS.
- •Начальная перестановка НП:
- •Конечная перестановка КП:
- •S-box, используемые при шифрации:
- •S-box, используемые при дешифрации:
50
После чего выполняются преобразования в 16 циклах ( r =0,…,15 ):
(Fr,0 , Fr,1 ) = F (Rr,0 , Rr,1 , r) ,
Rr+1,0 =ЦСП(Rr,2 Fr,0 ,1) ,
Rr+1,1 =ЦСЛ(Rr,3,1) Fr,1 ,
Rr+1,2 = Rr,0 ,
Rr+1,3 =Rr,1 ,
где ЦСЛ и ЦСП — функции циклического сдвига влево и вправо, соответственно. При этом второй аргумент этих функций указывает число бит, на которое такой сдвиг происходит. Заключительное преобразование — сложение по модулю два:
Ci = R16,(i+2) mod 4 Ki+4 , i =0,…,3.
Затем четыреполученных слова переписываются в16 байт c0 ,c1,…,c15 зашифрованного сообщения:
|
|
|
|
C i / 4 |
|
|
|
|
с |
= |
|
|
|
|
mod 28 |
, i = 0,...,15 |
|
|
8(i mod4) |
|||||||
i |
|
2 |
|
|
||||
|
|
|
|
|
|
|
|
|
где ... означает округление числа до ближайшего целого в меньшую сторону.
Рассмотрим теперь подробнее отдельные преобразования, используемые в алгоритме.
Функция F
Функция F — 64-битная перестановка, зависящая от ключа. Ее аргументами являются два 32битных слова R0 и R1 , и индекс цикла r , используемый для выбора соответствующих блоков
ключа. R0 подвергается преобразованию, определяемому функцией g , в результате получается блок T0 . R1 первоначально циклически сдвигается на 8 бит влево, а затем также подвергается преобразованию g , в результате чего получается блок T1 . Далее блоки T0 и T1 трансформируются с помощью ПАП и складываются по модулю два с соответствующими блоками ключа.
Формально функцию F можно записать следующим образом:
T0 = g(R0 ),
T1 = g(ЦСЛ(R1,8)),
F0 = (T0 +T1 + K2r+8 ) mod 232 ,
F1 = (T0 + 2T1 + K2r+9 ) mod 232 ,
где F0 , F1 — результат функции F .
Преобразование g
По признанию авторов, это преобразование является "сердцем" алгоритма Twofish. Исходный блок X (равный R0 или ЦСЛ(R1,8) ) разбивается на четыре байта. Каждый байт подвергается
преобразованию в соответствующей S-box, функционирование которой зависит от значения соответствующего блока ключа (реализация S-box определяется специальной функцией h , которая будет описана ниже). Результатом преобразования 8-битного блока xi в S-box si является также 8-
битный блок yi . Эти четыре блока yi ( i =0,…,3 или i =4,…,7 ) представляются как вектор дли-
ны 4 над GF(28), который затем умножается на МДР1-матрицу 4×4 (при этом все операции выполняются в поле GF(28)). После выполнения такой операции получается 32-битное слово Z , которое и является результатом преобразования g .
1 МДР-матрица является порождающей матрицей специального класса помехоустойчивых кодов, разделимых кодов с максимальным расстоянием. Более подробную информацию можно найти в книге Ф.Дж. МакВильямс, Н.Дж.А.Слоэн "Теория кодов, исправляющих ошибки", М., Связь, 1979.
51
Формально преобразование g можно записать следующим образом:
xi = X / 28i mod 28 , i = 0,...,3; yi = si [xi ], i = 0,...,3;
z0 |
|
|
|
z |
|
||
1 |
|
= |
МДР |
z2 |
|
|
|
|
|
|
|
z3 |
|
|
|
3
Z = ∑zi 28i.
i=0
y0 y1 ; y2 y3
Поле GF(28), используемое в вычислениях, перечисленных выше, задается примитивным многочленом
m(x) = x8 +x6 +x5 +x3 +1.
Используемая в алгоритме МДР-матрица имеет следующий вид:
|
МДР |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
= ⎜
01 |
EF |
5B |
5B |
|
, |
5B |
EF |
EF |
01 |
|
|
EF |
5B |
01 |
EF |
|
|
EF |
01 |
EF |
5B |
|
|
|
|
||||
где элементы матрицы записаны в шестнадцатеричной системе счисления.
Генерация ключей
Процедура генерации ключей обеспечивает создание 40 слов расширенного ключа и четырех зависимых от ключа S-box, используемых в функции g . Как отмечалось ранее, алгоритм Twofish
рассчитан на ключ длиной N =128 , 192 или 256 бит. Если длина ключа не совпадает с этими величинами, то недостающие до ближайшего установленного N биты ключа назначаются равными нулю.
Определим величину k =N /64 . Ключ M состоит из 8k байт чально переписываются в 2k слов по 32 бита в каждом,
3
M i =∑m(4i+ j) 28 j , i =0,...,2k −1,
j=0
азатем в два вектора длины k :
Mч = (M 0 , M 2 , …, M 2k−2 ), M н = (M1, M 3, …, M 2k−1 ).
Третий вектор длины k также получается из исходного ключа. Для этого байты ключа группируются по 8 и интерпретируются как вектора, составленные из элементов GF(28). Затем эти вектора умножаются справа на матрицу 4×8 , полученную из порождающей матрицы помехоустойчивого кода Рида-Соломона над GF(28) c длиной кодового слова 12 и порождающим многочленом четвертой степени, так что (si,0 si,1si,2 si,3m8i m8i+1m8i+2m8i+3m8i+4m8i+5m8i+6m8i+7 ) — кодовое слово этого
кода. То есть (m8i m8i+1m8i+2m8i+3m8i+4m8i+5m8i+6m8i+7 ) — информационные, а (si,0si,1si,2 si,3 ) — проверочные символы:
si,0
si,1
si,2
si,3
|
. ... |
|
|
|
= . РС |
|
|
|
. ... |
|
|
m8im8i+1m8i+2
.. m8i+3 ,
. m8i+4m8i+5m8i+6m8i+7
3
Si = ∑si, j 28 j , j=0
для i =0,…,k −1 .
52
Таким образом, из каждых восьми байт исходного ключа получается 32-битное слово. Эти слова и формируют третий вектор S :
S =(Sk −1,Sk −2 ,...,S0 ).
Здесь следует отметить, что компоненты записываются в вектор S в обратном порядке.
Для перемножения вектора на проверочную матрицу кода РС используется таблица умножения для элементов GF(28) с примитивным многочленом w(x) = x8 +x6 +x3 +x2 +1 ,
. |
... . |
|
= |
|
01 |
A4 |
55 |
87 |
5A |
58 |
DB |
9E |
|
|
. |
РС . |
|
A4 |
56 |
82 |
F3 |
1E |
C6 |
68 |
E5 . |
||||
|
. |
... . |
|
|
|
02 |
A1 |
FC |
C1 |
47 |
AE |
3D |
19 |
|
|
|
|
|
|
55 |
87 |
5A |
58 |
DB |
9E |
03 |
|
||
|
|
|
A4 |
|
||||||||||
Векторы Mч , M н и S образуют базис для алгоритма генерации ключей с использованием функции h .
Замечание: Следует отметить различие примитивных многочленов, задающих поле GF(28), и тем самым определяющих правила вычислений в этом случае и при реализации преобразования g .
Функция h
На Рис. 4.10 представлена схема функции h . У этой функции два аргумента — 32-битное слово X и список L =(L0 ,…, Lk −1 ) из k 32-битных слов, результатом ее выполнения является 32битное слово Z .
Формально выполнение функции h можно записать следующим образом: li, j = Li / 28 j mod 28 ,
x j = X / 28 j mod 28 ,
для i =0,…,k −1 и j =0,…,3 . Затем выполняется последовательность подстановок и сложений по модулю два.
yk , j = x j , j =0,…,3 ;
для k =4 :
y3,0 = q1[ y4,0 ] l3,0 ; y3,1 = q0 [ y4,1 ] l3,1 ; y3,2 = q0 [ y4,2 ] l3,2 ; y3,3 = q1[ y4,3 ] l3,3 ;
для k ≥ 3:
y2,0 = q1[ y3,0 ] l2,0 ; y2,1 = q1[ y3,1 ] l2,1 ; y2,2 = q0 [ y3,2 ] l2,2 ; y2,3 = q0 [ y3,3 ] l2,3 ;
при всех значениях k будет выполняться:
y0 = q1[q0 [q0 [ y2,0 ] l1,0 ] l0,0 ] ; y1 = q0 [q0 [q1[ y2,1 ] l1,1 ] l0,1 ] ; y2 = q1[q1[q0 [ y2,2 ] l1,2 ] l0,2 ] ; y3 = q0 [q1[q1[ y2,3 ] l1,3 ] l0,3 ] ;
где q0 и q1 — фиксированные преобразования для 8-битных векторов, которые будут рассмотрены немного позже.
53
Рис. 4.10. Общая схема функции h .
Результирующий вектор из y0 , y1 , y2 , y3 перемножается на МДР-матрицу, так же, как это делалось в функции g :
z0 |
|
|
|
|
|
|
|
z1 |
|
= |
. |
z2 |
|
. |
|
|
|
|
. |
z3 |
|
|
|
|
|
|
|
y0 |
|
... |
. |
|
|
|
|
|
|
y1 |
|
||
МДР |
. |
|
y2 |
, |
|
... |
. |
|
|
|
|
|
|
|
|
y3 |
|
3
Z = ∑zi 28i ,
i=0
где Z — результат функции h .
