SageMath имеет отличный S-бокс пакет, который активно используется разработчиками S-Box. Если вы собираетесь учиться/играть с S-Box, вы можете воспользоваться этим пакетом.
С пакетом Sbox (Попробуйте онлайн)
из sage.crypto.sbox импортировать SBox
# должно быть степенью двойки, иначе ошибка
p = Перестановки (диапазон (16)).random_element()
S = SBox(p);
print("Перестановка", S)
print("Обратная перестановка", S.inverse())
SageMath в настоящее время использует Python3, поэтому можно очень легко написать свою версию либо на Python, либо на SageMath (Попробуйте онлайн);
P = Перестановки (диапазон (16)).random_element()
print("Перестановка", P)
InverseP=[P.index(i) для i в диапазоне(16)]
print("Обратная перестановка", InverseP)
Как мы видим, пакет S-Box намного лучше, например, конструкция проверяет, равен ли размер степени двойки или нет.
Примечание: Я использовал случайные перестановки, чтобы гарантировать существование обратного.
Как мы видим из Источник пакета Sbox
м = self.input_size()
L = [self(i) для i в диапазоне (1<<m)]
return SBox([L.index(i) для i в диапазоне (1<<m)], big_endian=self._big_endian)
SageMath преобразует S-Box в список, берет обратное значение в списке, а затем создает S-Box в списке. Как мы видим, обратное, если оно существует, не является волшебством.