Опубликован: 19.01.2010 | Доступ: свободный | Студентов: 3547 / 611 | Оценка: 4.28 / 4.00 | Длительность: 26:16:00
ISBN: 978-5-9963-0242-0
Специальности: Математик
Лекция 8:

Стандарт шифрования данных (DES)

< Лекция 7 || Лекция 8: 123456 || Лекция 9 >

Шифр и обратный шифр

Используя смеситель и устройство замены, мы можем создать шифр и обратный шифр для каждого из 16 -ти раундов. Шифр используется на стороне шифрования; обратный шифр — на стороне дешифрования. Алгоритмы создания шифра и обратного шифра аналогичны.

Первый способ

Один из методов, чтобы достигнуть поставленной цели (шифрование и обратное шифрование), состоит в том, чтобы сделать последний раунд отличающимся от других; он будет содержать только смеситель и не будет содержать устройства замены, как это показано на рис. 8.9.

Мы доказали в "Введение в основы современных шифров с симметричным ключом" , что смеситель и устройство замены самоинверсны. Конечные и начальные перестановки также инверсны друг другу. Левая секция исходного текста на стороне шифрования шифруется L0 как L16, и L16 дешифруется на стороне дешифратора как L0. Аналогичная ситуация с R0 и R16.

Нужно запомнить очень важное положение, которое касается шифров: ключи раундов ( K1 и K16 ) применяются при шифровании и дешифровании в обратном порядке. На стороне шифрования первый раунд применяет ключ K1, а раунд 16 — ключ K16 ; при дешифровании раунд 1 использует ключ K16, а раунд 16 — ключ K1.

В первом методе последний раунд не имеет устройства замены.
 DES шифр и обратный шифр для первого способа

увеличить изображение
Рис. 8.9. DES шифр и обратный шифр для первого способа
Алгоритм

Алгоритм 8.1. приведен в псевдокодах для шифрования и соответствует четырем шагам первого метода. Коды для остальных могут быть сделаны как упражнение.

Cipher (plainBlock[64], Round Keys[16,48])
{
   pemute (64,64, plainBlock, inBlock, IntialPermutationTable)
   spilt (64, 32, inBlock, leftBlock, right Block)
   for (round = 1 to 16)
   {
      mixer (leftBlock, right Block, RoundKey[round])
      if (round!=16) swapper(leftBlock, right Block)
   }
   combine (32, 64, leftBlock, right Block, outBlock)
   pemute (64,64, outBlock, cipherBlock, FinalPermutationTable)

mixer (leftBlock[48], right Block[48], RoundKey[48])
{
   copy (32, rightBlock, T1)
   function (T1, RoundKey,T2)
   exclusive Or (32, leftBlock, T2,T3)
   copy (32, rightBlock, T1)
}

swapper (leftBlock[32], right Block[32])
{
   copy (32, leftBlock, T)
   copy (32, rightBlock, leftBlock)
   copy (32, T, rightBlock)
}

Substitute (in block[32], outblock[48], SubstituteTables[8,4,16])
{
   for(I = 1 to 8)
   {
      row <- 2 x inBlock[i x 6+1] + inBlock[i x 6+6]
      col <- 8 x inBlock[i x 6+2] + 4 x inBlock[i x 6+3]+2 x inBlock[i x 6+4] + inBlock[i x 6+5]

      value = SubstituteTables[i][row][col]

      outBlock[i x 4+1] <- value/ 8         value <- value mod 8
      outBlock[i x 4+2] <- value/ 4         value <- value mod 4
      outBlock[i x 4+3] <- value/ 2         value <- value mod 8
      outBlock[i x 4+4] <- value
   }
}
}
8.1. Псевдокоды для DES шифра
Альтернативный способ

При первом способе раунд 16 отличается от других раундов тем, что там не применяется устройство замены. Это необходимо, чтобы сделать последний и первый смесители в шифре одинаковыми. Мы можем делать все 16 раундов одинаковыми, добавляя к 16 -му раунду дополнительное устройство замены (два устройства замены позволяют нейтрализовать друг друга). Разработку этой схемы мы оставляем для упражнений.

Генерация ключей

Генератор ключей создает шестнадцать ключей по 48 битов из ключа шифра на 56 битов. Однако ключ шифра обычно дается как ключ из 64 -х битов, в котором 8 дополнительных битов являются битами проверки. Они отбрасываются перед фактическим процессом генерации ключей, который показан на рис. 8. 10.

Удаление битов проверки

Предварительный процесс перед расширением ключей — перестановка сжатия, которую мы называем удалением битов проверки. Он удаляет биты четности (биты 8, 16, 24, 32..., 64 ) из 64 -битового ключа и переставляет остальную часть битов согласно таблице 8.12. Остающееся значение на 56 битов — фактический ключ шифра, который используется, чтобы генерировать ключи раунда. Биты удаляются с помощью перестановки ( P -блока сжатия), как это показано в таблице 8.12.

Таблица 8.12. Таблица удаления проверочных битов
57 49 41 33 25 17 09 01
58 50 42 34 26 18 10 02
59 51 43 35 27 19 11 03
60 52 44 36 63 55 47 39
31 23 15 07 62 54 46 37
30 22 14 06 61 53 45 37
29 21 13 05 28 20 12 04
 Генерация ключей

Рис. 8.10. Генерация ключей
Сдвиг влево

После прямой перестановки ключ разделен на две части по 28 битов. Каждая часть сдвигается влево (циклический сдвиг) на один или два бита. В раундах 1, 2, 9 и 16 смещение – на один бит, в других раундах — на два бита. Затем эти две части объединяются, чтобы создать часть в 56 бит. Таблица 8.13 показывает число сдвигов манипуляций для каждого раунда.

Таблица 8.13. Число сдвигаемых бит
Раунд 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
Число бит 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 1
Перестановка сжатия

Перестановка сжатия ( P -блок) изменяет 56 битов на 48 битов, которые используются для формирования ключа раунда. Перестановка сжатия показана в таблице 8.14.

Таблица 8.14. Таблица сжатия ключа
14 17 11 24 01 05 03 28
15 06 21 10 23 19 12 04
26 08 16 07 27 20 13 02
41 52 31 37 47 55 30 40
51 45 33 48 44 49 39 56
34 53 46 42 50 36 29 32
Алгоритм

Теперь напишем простой алгоритм для создания ключа из ключа с проверочными битами. Алгоритм 8.2 использует несколько процедур алгоритма 8.1. Имеется и одна новая процедура — левый сдвиг ( ShiftLeft ). Обратите внимание, что T — временный блок.

Key_Generator (keyWithParities[64], RoundKeys[16. 48]. SinfTable[16])
 {                                                      '                  
 permute (64, 56, keyWithParities, cipherKey, ParityDropTable)
spilt (56, 28, cipherKey, leftKey, rightKey) 
for (round = 1 to 16) 
   {                                                                      
   shiftLeft (leftKey, ShiftTable[round1])                                    I
   shiftLeft (rightKey, ShiftTable [round])
   combine (28, 56, leftKey, rightKey, preRoundKey)
   permute (56, 48, preRoundKey, RoundKeys[round], KevCompressionTable)
   }
}

shiftLeft (block[28], NumOfShifts)
{
   for (i = 1 to numShifts)
   {
      T <- block[ 1]
      for (j = 2 to 28)
      {
          block [j-1] <- block [j]
      }
      block[28] <- T
   }
}
8.2. Алгоритм 8.2. Алгоритм для генерации ключей раунда

Примеры

Перед анализом DES рассмотрим несколько примеров, чтобы понять, как шифрование и дешифрование меняют значение битов в каждом раунде.

Пример 8.5

Мы выбираем случайный блок исходного текста и случайный ключ и определяем, каким должен быть блок зашифрованного текста (все цифры даны в шестнадцатеричном исчислении).

Plaintext: 123456ABCD 132536	Key: AABB09182736CCDD
Cipher Text: COB7ASD05F3AS29C

Покажем результат каждого раунда и текста, созданного до и после раундов. Таблица 8.15 показывает результаты первых шагов перед началом раунда. Исходный текст — прошедший через начальную перестановку для получения различных 64 бит ( 16 шестнадцатеричных цифр).

Таблица 8.15. Трассировка данных в примере 8.5
Исходный текст: 123456ABCD 132536
После первоначальной перестановки: 14A7D67818CA18D После разбиения: L0= 14A7D678 R0 = 18CA18D
Раунд Левая Правая Ключ раунда
Раунд 1 18CA18AD 5A78E394 194CD072DE8C
Раунд 2 5A78E394 4A1210F6 4568581ABCCE
Раунд 3 4A1210F6 B8089591 06EDA4ACF5B5
Раунд 4 B8089591 236779C2 DA2D032B6EE3
Раунд 5 236779C2 A15A4B87 69A629FEC913
Раунд 6 A15A4B87 2E8F9C65 C1948E87475E
Раунд 7 2E8F9C65 A9FC20A3 708AD2DDB3C0
Раунд 8 A9FC20A3 308BEE97 34F822F0C66D
Раунд 9 308BEE97 10AF9D37 84BB4473DCCC
Раунд 10 10AF9D37 6CA6CB20 02765708B5BF
Раунд 11 6CA6CB20 FF3C485F 6D5560AF7CA5
Раунд 12 FF3C485F 22A5963B C2C1E96A4BF3
Раунд 13 22A5963B 387CCDAA 99C31397C91F
Раунд 14 387CCDAA BD2DD2AB 251B8BC717D0
Раунд 15 BD2DD2AB CF26B472 3330C5D9A36D
Раунд 16 19BA9212 CF26B472 181C5D75C66D
После объединения: 19BA9212 CF26B472
Зашифрованный текст: C0B7A8D05F3A829C (после конечной перестановки)

Таблица показывает результат 16 раундов, которые включают смешивание и замену (исключая последний раунд). Результаты последних раундов ( L16 и R16 ) объединены. Наконец, текст проходит конечную перестановку, для того чтобы получить зашифрованный текст.

Следует отметить некоторые положения. Правая секция каждого раунда совпадает с левой секцией следующего раунда. Причина в том, что правая секция проходит через смеситель без изменения, а устройство замены переносит ее в левую секцию. Например, R1 передается через смеситель второго раунда без изменения, но затем, пройдя устройство замены, он становится L2. Второе интересное положение: на последнем раунде мы не имеем устройства замены. Именно поэтому R15 становится R16 вместо того чтобы стать L16.

Пример 8.6

Давайте рассмотрим, как Боб в пункте назначения может расшифровать зашифрованный текст, полученный от Алисы, с помощью совпадающего ключа. Для экономии времени мы разберем только несколько раундов. Таблица 8.16 показывает интересующие нас точки. Первое правило: ключи раунда должны использоваться в обратном порядке. Сравните таблицу 8.15 и таблицу 8.16. Ключ раунда 1 — такой же как ключ для раунда 16. Значения L0 и R0 при дешифрации те же самые, что и значения L16 и R16 при шифровании. Аналогичные совпадения будут получены и в других раундах. Это доказывает не только, что шифр и обратный шифр инверсны друг другу, но также то, что каждый раунд при шифрации имеет соответствующий раунд при дешифрации в обратном шифре. Результат свидетельствует, что начальные и конечные перестановки также являются инверсиями друг друга.

Таблица 8.16. Трассировка данных в примере 8.6
Зашифрованный текст: C0B7A8D05F3A829C
После первоначальной перестановки: 19BA9212 CF26B472 После разбиения: L0= 19BA9212 R0 = CF26B472
Раунд Левая Правая Ключ раунда
Раунд 1 CF26B472 BD2DD2AB 181C5D75C66D
Раунд 2 BD2DD2AB 387CCDAA 3330C5D9A36D
......... ......... ......... .........
Раунд 15 5A78E394 18CA182AD 4568581ABCCE
Раунд 16 19BA9212 18CA18AD 194CD072DE8C
После объединения: 14A7D67818CA18D
Исходный текст: 123456ABCD 132536 (после конечной перестановки)
< Лекция 7 || Лекция 8: 123456 || Лекция 9 >
Евгений Виноградов
Евгений Виноградов

Прошел экстерном экзамен по курсу перепордготовки "Информационная безопасность". Хочу получить диплом, но не вижу где оплатить? Ну и соответственно , как с получением бумажного документа?

Илья Сидоркин
Илья Сидоркин

Добрый день! Подскажите пожалуйста как и когда получить диплом, после сдичи и оплаты?????