S-box Rijndael — это блок подстановки ( таблица поиска ), используемый в шифре Rijndael, на котором основан криптографический алгоритм Advanced Encryption Standard (AES) . [1]
S-box отображает 8-битный вход, c , в 8-битный выход, s = S ( c ) . Как вход, так и выход интерпретируются как полиномы над GF(2) . Сначала вход отображается в его мультипликативную обратную ячейку в GF(2 8 ) = GF(2) [ x ]/( x 8 + x 4 + x 3 + x + 1) , конечном поле Рейндала . Ноль, как тождество, отображается в себя. Это преобразование известно как S-box Ниберга в честь его изобретателя Кайсы Ниберг . [2] Затем мультипликативная обратная ячейка преобразуется с помощью следующего аффинного преобразования :
где [ s 7 , ..., s 0 ] — выход S-box, а [ b 7 , ..., b 0 ] — мультипликативная инверсия в виде вектора.
Это аффинное преобразование представляет собой сумму множественных поворотов байта как вектора, где сложение представляет собой операцию XOR:
где b представляет собой мультипликативную инверсию, — побитовый оператор XOR , — левый побитовый циклический сдвиг , а константа 63 16 = 01100011 2 задана в шестнадцатеричном формате .
Эквивалентная формулировка аффинного преобразования имеет вид
где s , b и c — 8-битные массивы, c — 01100011 2 , а нижние индексы указывают ссылку на индексированный бит. [3]
Другой эквивалент:
где — полиномиальное умножение и , взятых как битовые массивы.
Обратный S-box — это просто S-box, запущенный в обратном порядке. Например, обратный S-box для b8 16 — это 9a 16 . Он вычисляется путем вычисления сначала обратного аффинного преобразования входного значения, а затем мультипликативного обратного. Обратное аффинное преобразование выглядит следующим образом:
Обратное аффинное преобразование также представляет собой сумму множественных поворотов байта как вектора, где сложение представляет собой операцию XOR:
где — побитовый оператор XOR , — левый побитовый циклический сдвиг , а константа 5 16 = 00000101 2 задана в шестнадцатеричном формате .
Rijndael S-box был специально разработан для устойчивости к линейному и дифференциальному криптоанализу. Это было достигнуто путем минимизации корреляции между линейными преобразованиями входных/выходных битов и одновременной минимизации вероятности распространения разницы.
S-box Rijndael может быть заменен в шифре Rijndael, [1] , что развеивает подозрение о бэкдоре, встроенном в шифр, который эксплуатирует статический S-box. Авторы утверждают, что структура шифра Rijndael, вероятно, обеспечит достаточную устойчивость к дифференциальному и линейному криптоанализу, даже если используется S-box со «средними» свойствами распространения корреляции/разности (ср. «оптимальные» свойства S-box Rijndael).
Следующий код на языке C вычисляет S-box:
#include <stdint.h> #define ROTL8(x,shift) ((uint8_t) ((x) << (shift)) | ((x) >> (8 - (shift))))void initialize_aes_sbox ( uint8_t sbox [ 256 ]) { uint8_t p = 1 , q = 1 ; /* инвариант цикла: p * q == 1 в поле Галуа */ do { /* умножаем p на 3 */ p = p ^ ( p << 1 ) ^ ( p & 0x80 ? 0x1B : 0 ); /* разделить q на 3 (равнозначно умножению на 0xf6) */ q ^= q << 1 ; q ^= q << 2 ; q ^= q << 4 ; q ^= q & 0x80 ? 0x09 : 0 ; /* вычислить аффинное преобразование */ uint8_t xformed = q ^ ROTL8 ( q , 1 ) ^ ROTL8 ( q , 2 ) ^ ROTL8 ( q , 3 ) ^ ROTL8 ( q , 4 ); sbox [ p ] = xformed ^ 0x63 ; } while ( p != 1 ); /* 0 — особый случай, поскольку он не имеет обратного */ sbox [ 0 ] = 0x63 ; }