- •Введение
- •Глава 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, используемые при дешифрации:
32
Рис. 3.13. Функция F .
Генерирование множеств подключей
Подключи генерируются с использованием алгоритма Blowfish:
1.Сначала создается множество P и четыре матрицы замены (S-box), в соответствии с заданной последовательностью. Эта последовательность состоит из шестнадцатеричных цифр числа π , стоящих после десятичной запятой:
P1 = 243F6A8816 , P2 = 85A308D316 , P3 =13198A2E16 , P4 = 0370734416 , и т.д.
2.Выполняется операция поразрядного сложения по модулю два (XOR) P1 с первыми 32 битами ключа, поразрядного сложения по модулю два (XOR) P2 со вторыми 32 битами ключа, и так далее для всех бит ключа (возможно до P14 ). Многократное повторение цикла для элементов ключевой последовательности до тех пор, пока не будет использовано все множество P . (Для любого короткого ключа имеется, по крайней мере, один эквивалентный более длинный ключ, например, если ключ состоит из 64 бит, то AA, AAA, и т.д., являются эквивалентными ключами).
3.Зашифровывается нулевая последовательность алгоритмом Blowfish, используя подключи, описанные в шагах (1) и (2).
4.Заменяются P1 и P2 результатом, полученным на выходе шага (3).
5.Зашифровывается результат шага (3), используя алгоритм Blowfish с измененными подключами.
6.Заменяются P3 и P4 с результатом, полученным после выполнения шага (5).
7.Процесс продолжается, заменяя все элементы множества P , а затем и все четыре S-box в соответствии с результатом непрерывно изменяющегося алгоритма Blowfish.
Всего требуется 521 повторение с тем, чтобы получить все требуемые подключи. При реализации алгоритма можно хранить все подключи с тем, чтобы не выполнять этот процесс многократно.
3.8. Алгоритм RC5
RC5 представляет собой фактически семейство спиралевидных шифров, обозначенных автором Роном Ривестом (Ron Rivest) [Riv95], как RC5- w/ r / b , где w — это размер слова, r — число этапов, а b — длина ключа в байтах.
В процессе преобразования блока исходной информации используется три действия: XOR, сложение и циклические сдвиги. В приводимом ниже примере мы рассмотрим случай w = 64 бита [Schn96]. Шифрование использует 2r + 2 зависящих от ключа 32-битных слов — S0 , S1 , S2 , ...,
33
S2r +1 , где r — число этапов. Алгоритм получения этих слов мы рассмотрим немного позже. Для
шифрования блок исходной информации сначала делится на два 32-битных подблока A и B . (RC5 предполагает следующее соглашение по упаковке байтов в блоки: первый байт блока исходного текста занимает младшие биты подблока A , и т.д.) Затем:
A = A + S0 ,
B = B + S1 .
И далее выполняется итеративный процесс для i от 1 до r :
A = ЦСЛ(( A B), B) + S2i , B = ЦСЛ((B A), A) + S2i+1 ,
где ЦСЛ(x, y) — циклический сдвиг содержимого регистра x на y бит влево, сложения выполняются по модулю 232 .
Результат оказывается в подблоках A и B .
Дешифрация выполняется в обратном порядке. Блок зашифрованного текста разбивается на два 32-битных подблока A и B , а затем выполняется итеративный процесс для i от 1 до r :
B = ЦСП((B − S2i+1),A) A ,
A= ЦСП(( A − S2i ),B) B ,
B= B − S1 ,
A = A − S0 ,
где ЦСП( x,y) — циклический сдвиг содержимого регистра x на y бит вправо, вычитания выполняются по модулю 232.
Создание массива ключей более сложно, но так же прямолинейно. Сначала, байты ключа копируются в массив L из c 32-битных слов, дополняя при необходимости заключительное слово нуля-
ми. Затем массив S инициализируется при помощи линейного конгруэнтного генератора по модулю 232:
S0 = P ,
далее выполняется итеративный процесс для i от 1 до r :
Si = (Si −1 +Q) mod 232 ,
P = B7E1516316 и Q = 9E3779B916 , эти константы взяты из двоичного представления трансцендентных чисел e и π .
В заключение n раз выполняются итеративные вычисления:
A = Si = ЦСЛ((Si + A + B), 3) ,
B = Li = ЦСЛ((Li + A + B), ( A + B)) , i = (i +1) mod 2(r +1) ,
j = ( j +1) mod c ,
где n = max(2(r +1), c) , и c = b / v , при начальных условиях: i = j = 0 ,
A = B = 0 .
