Noekeon
NOEKEON | |
---|---|
![]() | |
Создатель | Йоан Даймен Michaël Peeters Gilles Van Assche Винсент Рэймен |
Опубликован | 2000 г. |
Размер ключа | 128 бит |
Размер блока | 128 бит |
Число раундов | 16 |
NOEKEON — семейство из двухблочных шифров, разработанныхЙоаном Дайменом, Michaël Peeters,Gilles Van Assche иВинсентом Рэйменом и представленных в исследовательском проектеNESSIE[1]. Два шифра представляют собой NOEKEON в прямом режиме (direct mode) и в косвенном режиме (indirect mode). Отличаются режимы только процедурой расширения ключа.
Общие сведения
[править |править код]Длина ключа в NOEKEON равна 128 битам. В каждом раунде NOEKEON использует последовательность преобразований, обратных самим себе, которые с легкостью могут быть реализованы в аппаратном или программном обеспечении, причем даже в таком, где существует возможностьатаки по сторонним каналам. Шифр является компактным в реализации на различныхязыках программирования, быстро работает на различных аппаратных средствах и является очень эффективным в широком диапазоне платформ[2]. Однако, NOEKEON не отвечал требованиямWide Trail Design Strategy, что показал криптоанализ, проведенныйЛарсом Кнудсеном иHåvard Raddum в апреле 2001. Кнудсен иRaddum показали, что на данный шифр возможнаатака на основе связанных ключей[3], из-за чего шифр не прошел отбор в проекте NESSIE.
Описание алгоритма
[править |править код]Шифр
[править |править код]Алгоритм NOEKEON[4] выполняет 16 раундов преобразований с последующим применением функцииTheta
. Блок входных данныхState
представляет собой четыре 32-битных слов отa[0]
доa[3]
.
Алгоритм NOEKEON в обозначенияхC style pseudocode.
Noekeon(WorkingKey,State){For(i=0;i<Nr;i++)Round(WorkingKey,State,Roundct[i],0);State[0]^=Roundct[Nr];Theta(WorkingKey,State);}
Инверсия шифра выглядит следующим образом:
InverseNoekeon(WorkingKey,State){Theta(NullVector,WorkingKey);For(i=Nr;i>0;i--)Round(WorkingKey,State,0,Roundct[i]);Theta(WorkingKey,State);State[0]^=Roundct[0];}
Число раундовNr
равно 16. Единственная разница между NOEKEON и его инверсией заключается в вычисленииWorkingKey
для инверсии NOEKEON и применении раундовых констант.
Раунд преобразования
[править |править код]Каждый раунд алгоритма выполняет следующие действия:
- Первое слово входных данных складывается с помощью операции XOR с раундовой константой RC[r], где r — номер текущего раунда.
- Над входными словами производится линейное преобразование Theta с участием рабочего ключа WorkingKey.
- Первое слово снова складывается с помощью операции XOR с RC[r].
Описание раундов алгоритма на псевдокоде:
Round(Key,State,Constant1,Constant2){State[0]^=Constant1;Theta(Key,State);State[0]^=Constant2;Pi1(State);Gamma(State);Pi2(State);}
Все функции работают с состояниемState
, на который предоставляется указатель. Всегда одна из входных констант задана, как 0. Если раундовое преобразование применяется в прямом шифре, тоConstant2
устанавливается в 0, если же раундовое преобразование используется для обратного шифра, тоConstant1 = 0
.
Gamma
[править |править код]
Gamma являетсяинволютивным нелинейным отображением, по сути являющимся простой табличной заменой.Gamma
производит независимые операции над 32 подблоками бит, называемыми ящиками. Эти ящики состоят из 4 битов, стоящих на одной и той же позиции в каждом из четырёх 32-битовых слов, то есть ящик с номеромi формируется из значениямиi-х битов каждого из 32-битных слов:
Пусть далее являетсяi-м битом 32-битного слова, то есть являетсяn-м битом ящика. Тогда Gamma действует на ящики изState
следующим образом:
- .
Описание алгоритма Gamma на псевдокоде:
Gamma(a){a[1]^=~a[3]&~a[2];a[0]^=a[2]&a[1];tmp=a[3];a[3]=a[0];a[0]=tmp;a[2]^=a[0]^a[1]^a[3];a[1]^=~a[3]&~a[2];a[0]^=a[2]&a[1];}
Gamma
может быть определена в качестве альтернативыS-блока, применяемого к каждому из ящиков вState
, при этом значения каждого ящика вGamma
изменяются следующим образом:
Входное значение | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B | C | D | E | F |
Выходное значение | 7 | A | 2 | C | 4 | 8 | F | 0 | 5 | 9 | 1 | E | 3 | D | B | 6 |
Theta
[править |править код]
Theta
являетсялинейным отображением, которое применяется к состояниюState
с рабочим ключомk
.State
является массивом из восьми 16-битных колонок. Каждая колонка состоит из четырех наборов по 4 бит, стоящих в словах на позициях, равных по модулю 8. Например, колонка 5 состоит из битов 5, 13, 21 и 29 слова, битов 5, 13, 21 и 29 слова, битов 5, 13, 21 и 29 слова и битов 5, 13, 21 и 29 слова.Theta
выполняет следующую последовательность действий:
Критерии, используемые при разработке преобразования Theta:
- Возможность использовать как в прямом, так и в обратном режиме NOEKEON.
- Относительно небольшое число выполняемых операций.
- Достаточнаядиффузия данных
- Симметричность.
- Простота описания.
ФункцияTheta
на псевдокоде:
Theta(k,a){temp=a[0]^a[2];temp^=temp>>>8^temp<<<8;a[1]^=temp;a[3]^=temp;a[0]^=k[0];a[1]^=k[1];a[2]^=k[2];a[3]^=k[3];temp=a[1]^a[3];temp^=temp>>>8^temp<<<8;a[0]^=temp;a[2]^=temp;}
ИнверсиюTheta
можно получить, используя алгебраические свойства линейных отображений и тот факт, что первый о последний компонентыTheta
коммутируют:
Theta(k’,a);
Новый рабочий ключk' получается путём примененияTheta
к начальному ключуk
с нулевым рабочим ключом:
Theta(NullVector,k);
Это значит, что инверсияTheta
равна самойTheta
, только с другим значением рабочего ключа, который можно получить применениемTheta
к начальному рабочему ключу.
Операции сдвига
[править |править код]
Операции сдвигаPi1
иPi2
выполняютциклические сдвиги в трех из четырех слов с различными значениями смещения. Значения смещения отобраны в соответствии с следующими критериями:
- Операция Pi2 должна быть обратной к операции Pi1, чтобы иметь возможность использовать одинаковые раундовые преобразования как в прямом, так и в обратном шифрах.
- Все четыре смещения слов в этих операциях должны отличатсяпо модулю 8.
- Смещение нулевого слова a[0] должно равняться нулю.
- Массив смещений выбирается из множества массивов, оптимизирующих диффузию в течение одного цикла, при этом выбирается первый из всех получившихся массивов влексикографическом порядке.
Мерой диффузии является количество ящиков на выходе линейной части алгоритма, изменяющихся под воздействием изменения одного из ящиков на входе. Линейная часть алгоритма представляет собой последовательность функцийPi1
,Theta
,Pi2
. Другими словами, мера диффузии — это количество ненулевых ящиков на выходе при условии, что только один ящик на входе был ненулевым. Благодаря симметрии в этих трех функциях, число ненулевых ящиков на выходе не зависит от положения ненулевого ящика на входе. Число ненулевых ящиков на выходе для массива смещений[0,1,5,2]
равно 23, что является наилучшим результатом, удовлетворяющим критериям выбора смещений. Те же утверждения справедливы и для обратных операций.
Операции сдвига на псевдокоде:
Pi1(a){a[1]<<<=1;a[2]<<<=5;a[3]<<<=2;}Pi2(a){a[1]>>>=1;a[2]>>>=5;a[3]>>>=2;}
Расширение ключа
[править |править код]В косвенном режиме (indirect mode) рабочий ключWorkingKey
получается из секретного ключаCipherKey
путём использованияNOEKEON
с нулевымWorkingKey
:
WorkingKey=CipherKey;Noekeon(NullVector,WorkingKey);
В прямом режиме (direct mode) рабочий ключ совпадает с секретным, то есть расширение ключа отсутствует:
WorkingKey=CipherKey;
В обоих случаях рабочий ключ не изменяется между раундами.
Раундовые константы
[править |править код]
Раундовые константы накладываются в каждом раунде алгоритма на значение слова с помощью операции сложения по модулю 2 и используются в шифре для устранения некоторых свойств симметрии:
- Раундовое преобразование выполняется над различными ящиками данных одинаковою.
- Раундовые преобразования одинаковы для всех раундов шифра.
Стоит отметить, что только лишь последний байт раундовых констант является ненулевым, то есть в каждом раунде алгоритма с помощью раундовых констант изменяется только четвертый байт слова. Кроме того, значения констант отRC[1]
доRC[Nr]
в этом байте могут быть вычисленырекурсивным методом. Исходя из этого, раундовые константы можно записать на псевдокоде следующим образом:
Roundct[i]=(‘00’,‘00’,‘00’,RC[i]);RC[0]=0x80;if(RC[i]&0x80!=0)RC[i+1]=RC[i]<<1^0x1BelseRC[i+1]=RC[i]<<1;
Такое вычисление соответствуетрегистру сдвига с линейной обратной связью. Если нужно, то константы могут быть вычислены и в обратном порядке:
if(RC[i]&0x01!=0)RC[i-1]=RC[i]>>1^0x8DelseRC[i-1]=RC[i]>>1;
Раундовые константы вычисляются таким же образом, как и в алгоритмеRijndael, исключением является заданное значениеRC[0]
.
Криптоанализ алгоритма
[править |править код]На рассмотрение в рамках конкурса NESSIEбыли приняты оба режима алгоритма Noekeon[5]. Оба режима оказались подвержены атаке на основе связанных ключей, которую предложили криптологиЛарс Кнудсен иHåvard Raddum в своей работе[3]. Кроме того, ими же было доказано, что критерии создания таблиц замен в операции Gamma не способствуют высокой криптостойкости алгоритма: при генерации таблицы замен результирующий алгоритм с вероятностью примерно 86 % окажется подверженлинейному и/илидифференциальному криптоанализу. Также было показано, что с большой вероятностью возможно найтисвязанные ключи. Этих причин оказалось достаточно для невыхода алгоритма Noekeon во второй раунд конкурса.
Примечания
[править |править код]- ↑Алгоритмы шифрования — участники конкурса NESSIE (неопр.). Дата обращения: 24 ноября 2014. Архивировано 4 марта 2016 года.
- ↑The NOEKEON Page (неопр.). Дата обращения: 18 ноября 2014. Архивировано 1 марта 2015 года.
- ↑12[[Кнудсен, Ларс|Ларс Кнудсен]] и [[Håvard Raddum]] On NOEKEON (неопр.). Дата обращения: 18 ноября 2014. Архивировано 3 марта 2016 года.
- ↑[[Даймен, Йоан|Йоан Даймен]], [[ Michaël Peeters]], [[Gilles Van Assche]] и [[Рэймен, Винсент|Винсент Рэймен]] Nessie Proposal: NOEKEON (неопр.). Дата обращения: 28 декабря 2014. Архивировано 5 марта 2015 года.
- ↑[[Håvard Raddum]] The Statistical Evaluation of the NESSIE Submission (неопр.). Дата обращения: 24 ноября 2014. Архивировано 19 января 2022 года.