Рейтинг:1

Как работает этот код, вычисляющий AES S-Box?

флаг us

Как работает этот код, вычисляющий AES S-Box? Я не понимаю общей процедуры расчета. Код прикреплен ниже:

функция генерации (irreducible_poly) {
    пытаться{
        p = parseInt(eval(irreducible_poly.replace(/x/g, '10')), 2);
    } поймать (ошибиться) {
        console.log('Недопустимый неприводимый многочлен');
        возвращаться;
    }

    пусть t = новый Uint32Array(256);
    для (пусть я = 0, х = 1; я < 256; я ++) {
        т[я] = х;
        х ^ = (х << 1) ^ ((х >>> 7) * р);
    }

    пусть Sbox = новый Uint32Array(256);
    Sbox[0] = 0x63;
    для (пусть я = 0; я < 255; я ++) {
        пусть х = t[255 - i];
        х |= х << 8;
        х ^ = (х >> 4) ^ (х >> 5) ^ (х >> 6) ^ (х >> 7);
        Sbox[t[i]] = (x ^ 0x63) & 0xFF;
    }

    вернуть Сбокс;
}


// Инверсия Sbox
обратная функция (sbox) {
    пусть InvSbox = новый Uint32Array(256);
    для (пусть я = 0; я < 256; я ++) {
        InvSbox[i] = sbox.indexOf(i);
    }

    вернуть InvSbox;
}
kelalaka avatar
флаг in
То, что не ясно? Пробовали руками? Посмотрите примеры на нашем сайте? Вы видели это http://www.moserware.com/assets/stick-figure-guide-to-advanced/A%20Stick%20Figure%20Guide%20to%20the%20Advanced%20Encryption%20Standard%20%28AES%29. пдф
kelalaka avatar
флаг in
Отвечает ли это на ваш вопрос? [Как выполнить шестнадцатеричное умножение в GF (2 ^ 8)] (https://crypto.stackexchange.com/questions/63139/how-to-do-hexadecimal-multiplication-in-gf28). Возможно, этот вопрос является обманом или [Как рассчитываются эти таблицы умножения AES MixColumn?] (https://crypto.stackexchange.com/q/71204/18298). Не могли бы вы указать, что они решили вашу путаницу?
kelalaka avatar
флаг in
Где вы взяли этот код? Что ж, вы могли видеть этот код, однако, не могли бы вы [отредактировать] (https://crypto.stackexchange.com/posts/98396/edit) свой вопрос, чтобы указать, откуда вы это взяли, и даже дать ссылку на статью? https://engineering.purdue.edu/kak/compsec/NewLectures/Lecture8.pdf
флаг us
https://merricx.github.io/aes-sbox/
флаг us
вы должны проверить элементы, чтобы найти код
флаг ar
Надеюсь, вы не вводите недостоверные данные в функцию `generate`. ;) Я полагаю, это не так уж плохо, пока код работает только на стороне клиента, поскольку все, что вы можете скомпрометировать, - это песочница JS браузера, над которой пользователь браузера в любом случае имеет полный контроль с помощью инструментов разработчика. Но если бы это был скрипт на стороне сервера...
Рейтинг:2
флаг ng

Общая картина: этот код должен вычислить обратный по модулю двоичный неприводимый многочлен $P$ каждого ненулевого бинарного многочлена $R$ степени меньше, чем у $P$. Для этого был выбран производящий многочлен $G=1+x$, и табулирует $Q_i=G^i\bmod P$, который достигает всех желаемых $R$. Мультипликативная инверсия $R=Q_i$ является $Q_{255-i}$.


Этот код оценивает S-блок AES и обратно следующим образом:

  1. (кодовый блок, начинающийся в пытаться) Он оценивает р = 0x11б = 283 который представляет двоичный многочлен $P=1+x+x^3+x^4+x^8$ как целое число: значение, полученное при оценке этого многочлена для целого числа $х=2$. Это общее соглашение используется в AES для преобразования двоичных полиномов в целые числа.

  2. (кодовый блок, начинающийся в пусть т) Он вычисляет таблицу т[я] представляющий двоичный многочлен $Q_i=(1+x)^i\bmod P$ по этой конвенции. Что $Q_i$ рассчитывается на повторение $Q_{i+1}=Q_i\,(1+x)\bmod P$ с $Q_0=1$, переводя на t[i+1] = t[i] ^ ((t[i] << 1) ^ ((t[i] >>> 7) * p)) с т [0] = 1 в соответствии с указанной конвенцией.

    Например: $Q_0$ является (бинарным) многочленом $1$, представлена т [0] = 1. $Q_1=1+x$, представлена т[1] = 3. $Q_2=(1+х)^2=1+х^2$, представлена т[2] = 5. $Q_7=(1+х)^7=1+х+х^2+х^3+х^4+х^5+х^6+х^7$, представлена т[2] = 0xff = 255. $Q_8=(1+x)^8\bmod P=(1+x^8)\bmod P=x+x^3+x^4$, представлена т[8] = 0x1a = 26.

  3. (кодовый блок, начинающийся в пусть Sbox) Табулирование $Q_i=(1+x)^i\bmod P$ было полезно, потому что $(1+x)^{255}\bmod P=1$, следовательно $Q_{255-i}$ является мультипликативным, обратным $Q_i$. И $Q_i$ достигает всех ненулевых бинарных полиномов степени $<8$ (это $1+х$ является генератором). Поэтому целое число т[255 - я] представляет собой мультипликативную инверсию многочлена, что целое число т[я] представляет собой. И когда в петле я идет от 0 к 254 что дает мультипликативную обратную величину каждого из 255 ненулевых многочленов степени $<8$. Затем цикл просто применяет ² аффинное преобразование, указанное в оставшейся части цикла. определение AES S-box. Нулевой многочлен имеет особый случай.

    Например: когда в петле я = 8, т[я] является т[8] = 0x1a = 26 представляющий $Q_8=х+х^3+х^4$, и т [255-я] (собираюсь Икс, не связанный с $х$) является т[247] = 0xfd = 253 представляющий полином $Q_{247}=1+x^2+x^3+x^4+x^5+x^6+x^7$. Что $Q_{247}$ является мультипликативным, обратным $Q_8$. По определению S-блока AES остается только применить аффинное преобразование² к Икс, затем установите результат в Sbox[t[i]] = Sbox[26].

  4. (функция, обратная) Обратная таблица вычисляется путем поиска каждой записи в таблице. Это работает, но неэффективно. InvSbox[i] = sbox.indexOf(i); можно заменить более простым и эффективным InvSbox[sbox[i]] = i;.


¹ Обоснование: в t[i+1] = t[i] ^ ((t[i] << 1) ^ ((t[i] >>> 7) * p))

  • т[я] является целым числом в $[0,2^8)$ и представляет $Q_i$ степени $<8$
  • т[я] << 1 является четным целым числом в $[0,2^9)$ и представляет $Q_i\,x$.
  • т[я] >>> 7 либо 0 или же 1. Это коэффициент срока заказа $х^7$ в $Q_i$.
  • (t[i] >>> 7) * p соответственно либо 0 или же 0x11b = 283, представляющий $0$ или же $P$.
  • (t[i] << 1) ^ ((t[i] >>> 7) * p) соответственно представляет $(Q_i\,x)$ или же $(Q_i\,x)+P$, и (при рассмотрении двух случаев) является целым числом в $[0,2^8)$, таким образом, представляет собой бинарный полином степени $<8$, что, таким образом, $(Q_i\,x)\bmod P$.
  • t[i] ^ ((t[i] << 1) ^ ((t[i] >>> 7) * p)) таким образом, является целым числом в $[0,2^8)$ и представляет $Q_i+(Q_i\,x)\bmod P)=Q_i\,(1+x)\bmod P=Q_{i+1}$, степени $<8$.

В C стандартная идиома вероятного постоянного времени для этого выражения будет (по существу с & - используется вместо умножения):
t[i+1] = t[i] ^ ((t[i] << 1) ^ (p & -(t[i] >> 7))).
Примечание: некоторые переусердствовавшие компиляторы C будут ошибочно лаять на -, заставить их замолчать.


² Заявление х |= х << 8;дублирует биты в переменной Икс (представляющий модульную инверсию $Q_i$), так что последующие сдвиги вправо становятся эквивалентными вращению, когда речь идет о младших 8 битах. Заявление х ^ = (х >> 4) ^ (х >> 5) ^ (х >> 6) ^ (х >> 7); реализует циркуляционная матрица умножение. затем ^ 0x63 (представляющий многочлен $1+х+х^5+х^6$) — постоянное сложение, а & 0xFF сохраняет младшие 8 битов (с точки зрения степени $<8$), отменяя дублирование.

poncho avatar
флаг my
$1+x$ используется специально, потому что $(1+x)^i \bmod P$ достигает всех значений (кроме 0) для $i$ между 0 и 254; технический термин, который мы используем для этого, состоит в том, что $1+x$ является «генератором» этого поля (в то время как более простой термин $x$ им не является)
флаг us
так что не могли бы вы объяснить это по-своему ?? мне нужен этот алгоритм для моей дипломной работы. На самом деле я понимаю, какая часть для какого расчета, но для меня было бы лучше, если бы вы объяснили это одним примером, а не уравнением. Также; Sbox[t[i]] = (x ^ 0x63) & 0xFF; почему здесь используется FF, не могли бы вы объяснить???
fgrieu avatar
флаг ng
@ Aktar1990: я добавил числовые примеры, а также примечание 2, объясняющее аффинное преобразование, включая `(x ^ 0x63) & 0xFF`.Для `Sbox[t[i]]` это объясняется в "3.".
флаг us
@fgrieu У вас есть полный код для этого AES S-Box с лучшим объяснением. Я просто хочу, чтобы вы кодировали, когда я запускаю его, я получаю результат? У вас есть? Вы знаете временную и пространственную сложность AES S-Box??
fgrieu avatar
флаг ng
@ Aktar1990: вы выбрали этот код и его язык. У меня нет лучшего объяснения этого или кода с такой же низкой временной и пространственной сложностью: `generate` достаточно близок к оптимальному в используемом языке. Эффективный код использует полиномиальную математику и методы кодирования, которые требуют некоторого времени и усилий для понимания. Но поскольку вы занимаетесь смежной диссертацией, вы должны быть на это способны.
флаг us
@fgrieu Теперь я понимаю процедуру, большое спасибо.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.