На главную | Содержание | Назад | Вперёд
Наши друзья

 

 

Вычисления данных


LOKI97 зашифровывает 128-битовый открытый текст и создает 128-битовый шифртекст. Вычисление данных осуществляется разде­лением 128-битового значения входных данных | L|R] на два 64-бит­ных слова:
L0 = L R0 = R
Затем   они   пропускаются  через   16   циклов   (i   - 1,16) сбалансированной петли Фейстеля:
= Lw xor f (Ri.i + SKji.j, SKji.i)
Результирующее  128-битовое значение выхода (шифротекст) составляется следующим образом:
после последнего цикла, то есть не меняя местами, как обычно в циклах.
Функция f(A,B) должна быть создана так, чтобы гарантировать максимальный лавинный эффект между всеми входными битами
функции.
Текущее предложение для этой функции f(A,B) приводится
ниже.
Обратим   внимание   на   использование «симметричных»
преобразований (сложения) на R так же, как и более общее
преобразование L xor-ом с выходом функции.
Это формирует несравнимую группу с xor-ом, используемым на выходах из предыдущих циклов и, следовательно, обеспечивает некоторое рассеивание входных битов на входе функции так же, как и сокрытие последнего входного значения.
Таким образом, полное преобразование данных выглядит так:
При расшифровке вычисления включают в себя разбиение шифротекста:
L16 - L R16 =■ R
И затем прохождение по циклам в обратном порядке, т. е. используя 16 циклов (i - 1,16).
Ri.i -  L:  xor f (Ri-SKSi, SK31.:) L±.i " Ri-SK31-SK31_2
128-битное значение открытого текста получается как
[Ro 1Ь0]
Алгоритм выработки ключей
LOKI97 использует алгоритм выработки ключей, базирующийся на несбалансированной петле Фейстеля (как у Schneier и Kelsey [ScKe96]), оперирующий четырьмя 64-байтовыми словами. Используется та же функция f(A,B), как и при вычислении данных, чтобы обеспечить достаточную нелинейность для гарантии того, что вычислить связанные ключи трудно.
Алгоритм выработки ключей устанавливает четыре 64-битных слова [К40|КЗО|К20|К10] на основании размера предлагаемого ключа следующим образом :
При заданном 256-битном ключе [Ка|Кь|Кс|К(1]получим:
[К40|К30|К20|К10] = [Ka|Kb|Kc|Kd]
При заданном 192-битном ключе [К.,|КЬ|КГ] получим:
[К40|К30|К20|К10]   =   [Ka|Kb|Kc|f(Ka,Kb) ]
При заданном 128-битном ключе получим:
[K40|K30)K20|Kl0j   =   [Ka|Kb!f(Kb,Ka)|f«Ka,Kb)]
Затем они пропускаются через 48 циклов (i = 1,48) для получения 48 вспомогательных ключей:

 

 

 

 

 

 

 

 

 

 

K2i

 

где
gi (Kl,K3,K2)=f (Kl+K3+(Delta*i) ,K2) Delta —    (sqrt(5)-1)*262 — 9E3779B97F4A7C1516
312

Три цикла алгоритма выработки ключей требуются для создания трех вспомогательных ключей каждого цикла вычисления данных. Так, требуется всего 48 циклов для алгоритма выработки ключей, эк­вивалентных примерно трем зашифровывающим вычислениям.
Добавление формы Kl+K3+(Delta*i) в группу, несовместимую с xor-ом, используемым на выходе предыдущего цикла, — такое же, как и при вычислении данных.
Оно включает умножение по модулю 264 на Delta — значение, полученное из «золотого» соотношения для уменьшения проблем симметричности.
Расшифровывание использует ключи в обратном порядке, до­бавляя замену вспомогательного ключа SIv^..^ на SK3j и наоборот. Это необходимо, чтобы высчитать первоначально зашифрованное значе­ние, и не существует укороченного варианта без этого действия.
Функция f(A,B)
Сильно нелинейная функция f(A,B) имеет два 64-битных вход­ных значения А и В, которые обрабатываются с использованием двух «слоев» S-блоков с высочайшей степенью нелинейности для получе­ния 64-битного выхода.
Используются две перестановки для гарантии максимального
лавинного эффекта между всеми битами функции.
Основное новшество в предлагаемой мною разработке — это ис­пользование двух уровней S-P петли вместо одного, как в большинст­ве других существующих сейчас шифров Фейстеля.
Оно используется как для обеспечения максимального желаемо­го лавинного эффекта, так и для того, чтобы минимизировать возмож­ность существования подходящих разностных и линейных характери­стик (для осуществления атак).
Наличие ключевой перестановки на входе функции, перенаправ­ляющее различные входы S-блоков, гарантирует, что предугадать то, в какой S-блок попадет отдельный входной бит, — весьма сложно. Это увеличивает сложность получения любой полезной для атаки характе­ристики.
Данная функция ' выглядит следующим образом:
£(А,В)  = Sb  ( Р  (  Sa  ( Е   ( КР  ( А,В )   )   )   ), В)
В деталях различные составляющие операций таковы: КР()
Очень простая ключевая перестановка, которая разбивает 64-битный вход А на два 32-битных слова и использует нижние (т. е. наиболее значимые) 32 бита входа В, чтобы определить необходимо ли поменять соответствующие пары битов в этих словах (если бит ключа 1), или же нет (если бит ключа 0), похожая на что используется в ICE [Kwan97].
Это может быть вычислено как:
КР( [Al|Ar],SKr) = [((Al & -SKr)| (Ar & SKr)) | ( (Ar & ~SKr)I(Al & SKr))]
E{)
Расширяющая функция, похожая на соответствующую в LG.CI91, но измененная в плане более быстрого выполнения, которая разбивает на пересекающиеся группы по 13 или 11 бит (S1 или S2
соответственно) так, что по крайней мере несколько бит влияют на два S-блока одновременно, и, с учетом предыдущего сложения, это означает, что все биты имеют некоторое влияние на множество S-блоков. Таким образом, Е распределяет 64 бита входного значения на 96 битов выходного:
[4-0, 63-56 I 58-48 | 52-40 | 42-32 | 34-24 | 28-16 I 18-81 12-0] . Sa(),  Sb()
Две колонки S-блоков, выполненных просто конкатенацией блоков S1 и S2 (описанных ниже) так, что
Sa() [S1,S2,S1,S2,S2,S1,S2,S1] и
Sb()=[S2,S2,Sl,Sl,S2,S2,Sl,Sl].
В Sa() входы смешаны (вход + ключ из выхода Е), а в Sb() верхние биты — это только ключевые биты (из нижних, более значимых 32 битов В) .
р()
перестановка, рассеивающая выходы   S-блоков полностью по 64-
битной длине, используя регулярный шаблон латинского квадрата,
похожий на LOKI91, но с такими незначительными изменениями, что один и тот же выход никогда не войдет в соответствующий вход. Р распределяет входные биты [63-0] так:
[56,48,40,32,24,16,08,00,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,28,20,12,04,61,53,45,37,29,21,13,05, 62,54,46,38,30,22,14,06,63,55,47,39,31,23,15,07]
Я полагаю, что эта функция будет выполнима с 24 табличными заданиями (8 на каждый из Sa, Р и Sb), плюс несколько ог-ов, хог-ов, сдвигов и сложений на каждый цикл.
Это сделает ее выполнение реально быстрым и эффективным .
S-блоки
S-блоки, выбранные для LOKI97 используют возведение в куб в нечетном поле Галуа GF(2n), т. к. оно имеет несколько очень удобных свойств (таких, как сильная нелинейность и относительно однообраз­ный профиль хог). Чтобы количество входов было нечетно, в S1 ис­пользуется 13 входных битов, а в S2 U битов. Они распределяются так, как описано выше, чтобы объединиться для работы над каждым входным блоком. Входное значение инвертируется (так, что входы О или 1 никогда не дадут выходов 0 или 1), и выходное значение маскируется в выбранные 8 нижних выходных битов. Функции S-блоков таковы:
Sl[x] = Ых хог 1FFF)3 mod 2911) & FF, in (jl (213.) S2[x]   =   ( (x xor    7FF)3 mod   AA7)   & FF,    in GF(211)
(Заметим , что все константы приведены в 16-ричнойсистамс , а все вычисления сделаны как полиномиальные в GF(2n) ).
Контрольная тройка
Сертификационная тройка (пример LOKI97) такова:
LOKI97 key: 000102030405060708090ACBOCODOEOF10111213141516i718191AlBlClDlElF
LOKI97 plain:  0 0 0102 03 0 4 05 0 6 0 7 0 8 0 9 0AOBOCODOEOF
-
LOKI97 cipher: 75 0 80E3 5 9F10FE640144B3 5C5712 8DAD
Беглый криптоанализ
Мой беглый взгляд на криптоанализ говорит о том, что : Алгоритм выработки ключей
сильно нелинеен, вспомогательные ключи получены как выход функции f (А, В) и сложно зависят от всех ключевых бит. Я не могу найти какого-либо очевидного способа определения связанных ключей, что достигается прибавлением кратностей Delta в каждом цикле.

Зашифрование
сильно нелинейная функция f (А, В) имеет компоненты, напрямую зависящие от ключа, и полный лавинный эффект над 64 битами входа А, но в то же время — лишь частичный эффект входа В за один проход. Функция должна противостоять как разностному , так и линейному анализу. Уже после трех циклов должна быть полная зависимость от входа и ключа (заметим, что имеет место неполная зависимость L от L-битов после первого цикла).
Для дальнейшей работы, вероятно, должно быть рассмотрено следующее различие: L-половинки имеют постоянное сложение по модулю 2, а R-половинки имеют постоянную арифметическую разность. Это может отменить действие вспомогательных ключей на первом цикле и позволить сравнение циклового выхода, но только нулевые отличия дадут шанс получить распространение на следующий цикл. Также финальная ключевая перестановка должна неплохо уничтожить все возможности.
Безотлагательные вопросы
На этой ранней стадии основные моменты, на которые я бы хотел обратить внимание — это :
1. Выглядит ли основная структура разумной ?
2. Имеем ли мы верный баланс сложности: данные
против компонент-алгоритма выработки ключей ?
3. Достаточно ли добавка Delta маскирует
симметричность в ключевом расписании ?
4. Правильно ли выбрано число циклов (помня о
необходимости достаточного запаса безопас­ности для предполагаемо долгой жизни шифра) ?
Выводы
Эта статья включает мои предварительные и предполагающиеся мысли по поводу доработки LOKI. Любая или же все из них (в том числе и уже имеющихся) - это предмет для полного пересмотра и коренных и других изменений по ту сторону воображения!

 

На главную | Содержание | Назад | Вперёд
 
Яндекс.Метрика