Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЛБ1 ОКЗИ Криптосистемы схемы Файстеля.docx
Скачиваний:
4
Добавлен:
22.11.2019
Размер:
134.54 Кб
Скачать

Выбор операций

Шифр MARS использует множество операций (над 32-битовыми словами): суммирования по модулю два, сложения, вычитания, просмотры таблиц, умножения, а также вращения на фиксированное и переменное число битов.

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

Просмотры таблиц. Операции просмотра таблиц являются основой стойкости DES, также как и многих других шифров. MARS использует одну таблицу из 512 32-битовых слов, называемую S-box. Иногда S-box рассматривается как две таблицы, в каждой из которых содержится 256 слов.

В принципе, правильный выбор S-box позволяет обеспечить высокую стойкость против атак, использующих линейный и дифференциальный криптоанализ, а также высокую степень лавинного эффекта для битов данных и ключа. Недостатком просмотра таблиц является достаточно низкая скорость операции в программной реализации. В словоориентированных шифрах, таких как MARS, операция просмотра таблиц использует три инструкции (копирование исходного слова в индексный регистр, применение маски для выделения старших битов индекса, а также доступ к элементу таблицы). Также большие таблицы требуют значительного объема памяти для аппаратной реализации.

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

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

Фиксированные вращения. Вращения на фиксированное число позиций часто используется в программных реализациях шифра для того, чтобы доставить нужные биты на те места, которые будут использованы другими операциями наиболее эффективно (использование старших битов слова данных для применения в S-box).

Зависимые от данных вращения. Такие вращения впервые были использованы в IBM для создания фирменного шифра в конце 1970-х. Операция снова стала популярной в шифрах после ее использования Ривестом для построения шифра RC5.

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

Одной из проблем зависимых от данных вращений является то, что максимальное число позиций вращения для -битового слова составляет битов. Таким образом, если результат преобразования зависит от всех битов слова для следующей после вращения операции, он базируется лишь на той части битов, которая использовалась во вращении.

Такая проблема решается с помощью использования операций умножения.

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

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

В дизайне E-функции делается попытка комбинирования различных операций с целью максимизации преимуществ каждой из них. Основными свойствами функции являются:

  • при умножении двух слов младшие биты этих слов больше влияют на результат чем старшие биты. Поэтому биты переупорядочиваются таким образом, что те, которые не являются входом S-box должны быть наименее значащими в словах, которые перемножаются. Вращение на 13 битов позволяет максимизировать устойчивость E-функций к дифференциальным атакам;

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

  • при перемножении чисел наиболее значащие биты произведения являются «сильными битами», так как на них повлияли практически все входные биты.

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

Средняя линия является наиболее слабым выходом E-функции, так как применяется лишь суммирование со словом ключа и вращение на фиксированное число позиций. Слабость затем компенсируется дальнейшими вычислениями вне E-функции.

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

1. // добавление подключей к данным

2. for i = 0 to 3 do

3. D[i] = D[i] + K[i]

4. // 8 раундов прямого перемешивания

5. for i = 0 to 7 do

6. // четыре просмотра таблиц

7. D[1] = D[1]  S0[ low byte of D[0] ]

8. D[1] = D[1] + S1[ 2nd byte of D[0] ]

9. D[2] = D[2] + S0[ 3rd byte of D[0] ]

10. D[3] = D[3]  S1[ high byte of D[0] ]

11. // вращение слова вправо

12. D[0] = D[0] > 24

13. // дополнительные перемешивающие операции

14. if i = 0 or 4 then

15. D[0] = D[0] + D[3

16. if i = 1 or 5 then

17. D[0] = D[0] + D[1]

18. // вращение D[ ] на одно слово

19. (D[3];D[2];D[1];D[0]) (D[0];D[3];D[2];D[1])

20. end-for

Фаза 2: главное управляемое ключом преобразование

21. // 16 раундов управляемых ключом преобразований

22. for i = 0 to 15 do

23. (out1; out2; out3) = E-function(D[0];K[2i + 4];K[2i + 5])

24. D[0] = D[0] < 13

25. D[2] = D[2] + out2

26. if i < 8 then

27. D[1] = D[1] + out1

28. D[3] = D[3]  out3

29. else // last 8 rounds in backwards mode

30. D[3] = D[3] + out1

31. D[1] = D[1]  out3

32. end-if

33. // вращениеD[ ] на одно слово вправо

34. (D[3];D[2];D[1];D[0]) (D[0];D[3];D[2];D[1])

35. end-for

Поэтому конструкция средних раундов MARS рассматривается как «криптографическое ядро», окруженное слоями-оболочками. Вначале данные объединяются с ключом, а затем выполняются преобразования, которые не зависят от ключа (перемешивания на основе S-box). Ядро состоит из нескольких раундов зависящих от ключа преобразований, которые являются комбинацией просмотров таблиц, умножений и вращений, зависящих от данных.

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

Фаза 3: обратное перемешивание

36. // восемь раундов обратного перемешивания

37. for i = 0 to 7 do

38. // дополнительные перемешивающие операции

39. if i = 2 or 6 then

40. D[0] = D[0] -D[3]

41. if i = 3 or 7 then

42. D[0] = D[0] - D[1]

43. // четыре просмотра таблиц замен

44. D[1] = D[1]  S1[ low byte of D[0] ]

45. D[2] = D[2] - S0[ high byte of D[0] ]

46. D[3] = D[3] - S1[ 3rd byte of D[0] ]

47. D[3] = D[3]  S0[ 2nd byte of D[0] ]

48. // вращение исходного слова влево

49. D[0] = D[0] < 24

50. // вращение D[ ] на одно слово вправо

51. (D[3];D[2];D[1];D[0]) (D[0];D[3];D[2];D[1])

52. end-for

53. // вычесть ключи из данных

54. for i = 0 to 3 do

55. D[i] = D[i] - K[36 + i]

E-функция главного управляемого ключом преобразования

E-function(input: in; key1; key2)

1. // три временные переменные L;M;R

2. M = in + key1

3. R = (in <<< 13) × key2

4. i = младшие 9 битов M

5. L = S[i]

6. R = R<<< 5

7. r = младшие 5 битов R

8. M = M<<< r

9. L = L  R

10. R = R <<< 5

11. L = L  R

12. r = младшие 5 битов R

13. L = L<<< r

14. output (L;M;R)

Key-Expansion(input: k[]; n; output: K[])

1. // n – число слов в буфере ключа k[]; (4 ≤ n ≤ 14)

2. // K[] – расширенный ключевой массив, состоящий из 40 слов

3. // T[] – временный массив, состоящий из 15 слов

4. // B[] – фиксированная таблица из четырех слов

5. // инициализация B[]

6. B[] = {0xa4a8d57b; 0x5b5d193b; 0xc8a8309b; 0x73f9a978}

7. // инициализация T[] ключевыми данными

8. T[0…n-1] = k[0…n-1], T[n] = n, T[n+1…14] = 0

9. // четыре итерации, вычисление 10 слов K[] в каждой

10. for j = 0 to 3 do

11. for i = 0 to 14 do

12. T[i] = T[i]  ((T[i-7 mod 15]  T[i-2 mod 15]) < 3)  (4i + j)

13. repeat four times

14. for i = 0 to 14 do

15. T[i] = (T[i] + S[младшие 9 битов T[i-1 mod 15]])<<<9

16. end-repeat

17. for i = 0 to 9 do // сохранение следующих 10 слов в K[]

18. K[10j + i] = T[4i mod 15]

19. end-for

20. // модификация ключей, используемых для умножения

21. for i = 5; 7; … 35 do

22. j =младшие два бита K[i]

23. w = K[i] с установленными двумя младшими битами в 1

24. // генерация битовой маски M

25. M(l)= 1 если w(l) принадлежит последовательности из десяти нулей или единиц w

26. and also 2 ≤ l ≤30 and w(l-1) = w(l) = w(l+1)

27. // выбор образца из фиксированной таблицы и произвести вращение

28. r =младшие пять битов K[i - 1] // число позиций вращения

29. p = B[j]<<<r

30. // модифицировать K[i] с помощью p под контролем маски M

31. K[i] = w  (p ^M)

32. end-for

MARS-decrypt(вход: D[ ];K[ ])

Фаза (I): Прямое перемешивание

1. // добавление подключей к данным

2. for i = 0 to 3 do

3. D[i] = D[i] + K[36 + i]

4. // восемь раундов прямого перемешивания

5. for i = 7 down to 0 do

6. // вращение D[ ] одно слово влево

7. (D[3];D[2];D[1];D[0]) (D[2];D[1];D[0];D[3])

8. // вращение исходного слова вправо

9. D[0] = D[0] > 24

10. // четыре просмотра таблиц подстановки

11. D[3] = D[3]  S0[ 2nd byte of D[0] ]

12. D[3] = D[3] + S1[ 3rd byte of D[0] ]

13. D[2] = D[2] + S0[ high byte of D[0] ]

14. D[1] = D[1]  S1[ low byte of D[0] ]

15. // дополнительные перемешивающие операции

16. if i = 2 or 6 then

17. D[0] = D[0] + D[3]

18. if i = 3 or 7 then

29. D[0] = D[0] + D[1]

20. end-for

Фаза (II): Управляемое ключом преобразование

21. // 16 раундов преобразований

22. for i = 15 down to 0 do

23. //вращение D[] на одно слово влево

24. (D[3];D[2];D[1];D[0]) (D[2];D[1];D[0];D[3])

25. D[0] = D[0] >>>13

26. (out1; out2; out3) = E-function(D[0];K[2i+4];K[2i+5])

27. D[2] = D[2] - out2

28. if i < 8 then

29. D[1] = D[1] - out1

30. D[3] = D[3]  out3

31. else // первые восемь раундов

32. D[3] = D[3] - out1

33. D[1] = D[1]  out3

34. end-if

35. end-for

Фаза(III): Обратное перемешивание

36. // восемь раундов обратного перемешивания

37. for i = 7 down to 0 do

38. // вращение D[ ] на одно слово влево

39. (D[3];D[2];D[1];D[0]) (D[2];D[1];D[0];D[3])

40. // дополнительные микс-операции

41. if i = 0 or 4 then

42. D[0] = D[0] - D[3]

43. if i = 1 or 5 then

44. D[0] = D[0] - D[1]

45. // вращение слова влево

46. D[0] = D[0] < 24

47. // четыре просмотра таблиц подстановкиы

48. D[3] = D[3]  S1[ high byte of D[0] ]

49. D[2] = D[2] - S0[ 3rd byte of D[0] ]

50. D[1] = D[1] - S1[ 2nd byte of D[0] ]

51. D[1] = D[1]  S0[ low byte of D[0] ]

52. end-for

53. // вычитание подключей из данных

54. for i = 0 to 3 do

55. D[i] = D[i] - K[i]

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]