Стандарт шифрования данных (DES) — это алгоритм блочного шифрования, который принимает простой текст блоками по 64 бита и преобразует их в зашифрованный текст с использованием ключей из 48 бит. Это алгоритм с симметричным ключом, что означает, что для шифрования и дешифрования данных используется один и тот же ключ.
Этапы генерации ключей
В алгоритме 16 этапов шифрования, и для каждого используется свой ключ. круглый. Как генерируются ключи, указано ниже.
Биты помечены от 1 до 64, начиная с самого значащего бита и идя до наименьший значащий бит.
- Сжать и транспонировать данный 64-битный ключ в 48-битный ключ, используя следующую таблицу:
//Элементы массива обозначают номера битов int pc1 [56] = {57,49,41,33,25,17,9, 1,58,50,42,34,26,18, 10,2, 59,51,43,35,27, 19,11,3,60,52,44,36, 63,55,47,39,31,23,15, 7,62,54,46,38,30, 22, 14,6,61,53,45,37,29, 21,13,5,28,20,12,4};
-
Разделите результат на две равные части: C и D.
-
C и D смещены влево ci обычно. Для раундов шифрования 1, 2, 9 и 16 они циклически сдвинуты влево на 1 бит; для всех остальных раундов они циклически сдвинуты влево на 2.
-
Результат сжимается до 48 бит в соответствии со следующим правилом:
int pc2 [48] = {14,17,11,24,1,5, 3,28,15,6,21,10, 23,19,12,4,26,8, 16, 7,27,20,13,2, 41,52,31,37,47,55, 30,40,51,45,33,48, 44,49,39,56,34,53, 46,42, 50,36,29,32};
- Результат шага 3 — это входные данные для следующего раунда генерации ключа..
Шаги для шифрования
- Переставьте биты в 64-блоке в соответствии со следующим:
//58 означает, что 58-й бит следует считать//первым битом, 50-й бит вторым битом и так далее. int initial_permutation_table [64] = {58,50,42,34,26,18,10,2, 60,52,44,36,28,20,12,4, 62,54,46,38, 30,22,14,6, 64,56,48,40,32,24,16,8, 57,49,41,33,25,17,9,1, 59,51,43,35,27, 19,11,3, 61,53,45,37,29,21,13,5, 63,55,47,39,31,23,15,7};
-
Разделить результат на равные части: левый простой текст (1-32 бита) и правый простой текст (33-64 бита)
-
Полученные части проходят 16 раундов шифрование в каждом раунде.
Правый простой текст раскрывается с помощью следующей таблицы расширения:
//Элементы массива обозначают номера битов int extension_table [48] = {32, 1,2,3,4,5,4,5, 6,7,8,9,8,9,10,11, 12,13,12,13,14,15,16,17, 16,17, 18,19,20,21,20,21, 22,23,24,25,24,25,26,27, 28,29,28,29,30,31,32,1};
-
Расширенный правый простой текст теперь состоит из 48 бит и подвергается операции XOR с 48-битным ключом.
-
Результат предыдущего шага разделен на 8 блоков. Каждая коробка содержит 6 бит. После прохождения восьми блоков подстановки каждый блок уменьшается с 6 до 4 бит. Первый и последний бит каждого блока обеспечивает индекс строки, а остальные биты предоставляют индекс столбца. Эти индексы используются для поиска значений в поле подстановки. Поле подстановки состоит из 4 строк, 16 столбцов и чисел от 0 до 15..
-
Результат транспонируется в соответствии со следующим правилом:
//Элементы массива обозначают номера битов int permutation_table [32] = {16,7,20,21,29,12,28,17, 1,15,23,26,5,18,31,10, 2,8,24,14,32,27,3,9, 19,13,30,6,22,11,4,25};
-
Выполните операцию XOR левой половины с результатом из предыдущего шага. Сохраните это в правом простом тексте.
-
Сохраните исходный правый простой текст в левом простом тексте.
-
Эти половинки являются исходными данными для следующего раунда. Помните, что для каждого раунда существуют разные ключи.
-
После 16 раундов шифрования поменяйте местами левый простой текст и правый простой текст.
-
Наконец, примените обратную перестановку (обратную исходной перестановке), и зашифрованный текст будет сгенерирован.
Шаги для расшифровки
Порядок 16 48-битных ключей меняются местами, так что ключ 16 становится ключом 1 и так далее. Затем шаги для шифрования применяются к зашифрованному тексту.