
- •Введение
- •Глава 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, используемые при дешифрации:

42
Рис. 4.7. Общая схема алгоритма Serpent.
Создание S-box
Идея метода создания S-box взята из алгоритма шифрования RC4. В качестве исходного материала для создания S-box используется матрица sbox[ , ], состоящая из восьми S-box алгоритма DES
(каждая S-box в алгоритме DES имеет 4 строки и 16 столбцов, и ее элементами являются числа от 0 до 15). Затем в l -й строке выполняется перестановка местами i -го и k -го элементов, при этом значение k определяется значением j -го элемента в l +1 строке. При этом j определяется вектором ключа и номером i . Если полученный после такой перестановки массив обладает необхо-

43
димыми (разностными и линейными) свойствами, он сохраняется как S-box алгоритма Serpent. Эта процедура при последовательном увеличении l повторяется до тех пор, пока не будут получены все 8 S-box алгоритма.
Формально ее можно записать так:
Пусть key[] — массив, элементами которого являются младшие 4 бита ASCII-кодов символов ключа, t — вспомогательный параметр (первоначально t = 0 ),
l = t mod 32 ,
j = key[i]; k = sbox[l +1 mod 32, j] ; swap(sbox[l, k], sbox[l, j]) для i = 0,1,…,15 ;
где swap( , ) — перестановка соответствующих элементов массива.
Если получается S-box — она сохраняется, в противном случае t увеличивается на 1 и вычисления продолжаются до тех пор, пока не будут получены все 8 S-box.
Линейное преобразование
128-битное слово Bi , полученное после выполнения преобразований в блоке из 32 S-box, состоит из четырех 32-битных слов X 0 , X1 , X 2 , X 3 , которые и подвергаются линейному преобразованию:
X0 = ЦСЛ( X0 ,13) ;
X 2 = ЦСЛ( X 2 , 3) ;
X1 = X1 X 0 X 2 ;
X3 = X3 X2 СЛ( X0 ,3) ;
X1 = ЦСЛ( X1,1) ;
X 3 = ЦСЛ( X 3 , 7) ;
X 0 = X 0 X1 X 3 ;
X 2 = X 2 X 3 СЛ( X1, 7) ;
X 0 = ЦСЛ( X 0 ,5) ; X 2 = ЦСЛ( X 2 , 22) .
Полученные 32-битные блоки формируют 128-битный блок Bi+1 :
Bi+1 = X 0 , X1, X 2 , X 3 ,
СЛ( , ) — сдвиг влево, при этом освобождающиеся разряды заполняются нулями.
Генерация ключей
Сначала ключ расширяется до 256 бит, как это было описано ранее. Затем из полученного таким образом массива, элементами которого являются слова w−8 , w−7 , ..., w−1 получается промежуточ-
ный ключ w0 , w1 , ..., w131 по рекуррентной формуле: wi = ЦСЛ(wi−8 wi−5 wi−3 wi−1 φ i, 11) ,
где φ — дробная часть отношения золотого сечения (( |
5 +1) / 2) , равная в шестнадцатеричной |
форме 9E3779B9. Для получения очередного значения wi |
используется примитивный многочлен |
восьмой степени x8 + x7 + x5 + x3 +1 . |
|
Ключи для циклов алгоритма Serpent вычисляются из промежуточных ключей с использованием S-box. Сначала генерируется 132 вспомогательных ключевых блока k j по 32 бита каждый: