Рейтинг:2

Как рассчитать/сгенерировать обратный S-блок блочного шифра Кузнечика?

флаг pf

Предположим, я хочу изменить Кузнечик блочный шифр путем выбора случайного S-блока (например, взятого из /dev/random).

Как я могу рассчитать/сгенерировать обратный S-блок?

Кто-нибудь знает формулу или алгоритм, используемый для этого?

Рейтинг:2
флаг cn

Предполагая, что S-блоки являются перестановкой.

Вот пример на Python:

S = (2, 0, 1)
инверсия = [0] * длина (S)

для i в диапазоне (len (S)):
    обратный [S [я]] = я

печать (инверсия)

Вот пример на С:

целое число без знака S[256] = {...};
беззнаковое целое обратное[256];

для (целое я = 0; я < 256; я ++)
{
    обратный[S[i]] = я;
}
phantomcraft avatar
флаг pf
Довольно просто, я не думал, что это будет так просто. Спасибо!
Рейтинг:2
флаг in

Сагемат Пакет SBox друг учеников/дизайнеров SBox.

Для обратимого SBox;

# 0 1 2 3 4 5 6 7 #индекс
S = SBox([0, 1, 3, 6, 7, 4, 5, 2]) #выход
Sinv = S.inverse ()
печать(Синв)

выходы

(0, 1, 7, 2, 5, 6, 3, 4)

На самом деле реализовать обратное несложно; просто измените отношение индекс-выход. Помните, что инвертируемый SBox — это всего лишь перестановка.


Обратите внимание, что исходный код SageMath SBox здесь и, как хорошая библиотека, она сначала контролирует, является ли SBox перестановкой или нет, и возвращает объект SBox;

        если не self.is_permutation():
            поднять TypeError ("S-Box должен быть перестановкой")

        cdef Py_ssize_t я
        cdef list L = [self._S_list[i] для i в диапазоне (1 << self.m)]

        return SBox([L.index(i) для i в диапазоне(1 << self.m)],
                    big_endian=self._big_endian)
phantomcraft avatar
флаг pf
Спасибо за ответ. Знаете ли вы какой-нибудь похожий пакет/программу на C/C++, который делает то же самое, что и пакет Sagemath SBox?
kelalaka avatar
флаг in
@phantomcraft Я не знаю об этом, однако вы можете использовать его в [Python] (https://stackoverflow.com/q/61408795/1820553)
phantomcraft avatar
флаг pf
Получил, спасибо.
phantomcraft avatar
флаг pf
Извините, я выбрал другой вопрос как «полезный», потому что меня интересовала реализация C.
kelalaka avatar
флаг in
@phantomcraft, тогда вы спрашиваете не на том [так] сайте.Это не сайт программирования, и вы спросили: «Кто-нибудь знает формулу или алгоритм, используемый для этого?», поэтому я дал вам самый простой способ и простой алгоритм «обратить отношение индекс-выход». Без моего ответа этот вопрос скорее будет не по теме. Развлекайся.
kelalaka avatar
флаг in
Как вы можете видеть из исходного кода SageMath, прямой поиск инверсии не является правильным путем. Не верьте слепо, что SBox, загруженный из Интернета, обратим...

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

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