Редактировать! не возможно, если вы действительно хотите линейное преобразование. Вот математическое решение:
У вас есть четыре байта, a_1, a_2, a_3, a_4
, которые мы будем рассматривать как вектор a
с 4 компонентами, каждый из которых является числовым модом 256. Линейное преобразование - это просто матрица 4x4 M
, элементы которой также являются числами mod 256. У вас есть два условия:
- Из
M
a
мы можем вывести a
(это означает, что M
является обратимой матрицей).
- Если
a
и a'
отличаются одной координатой, то M
a
и M
a'
должны отличаться каждой координатой.
Условие (2) немного сложнее, но вот что это значит. Поскольку M
является линейным преобразованием, мы знаем, что
M
(a
- a
) = M
a
- M
a'
Слева, поскольку a
и a'
отличаются одной координатой, a
- a
имеет ровно одну ненулевую координату. Справа, поскольку M
a
и M
a'
должны различаться по каждой координате, M
a
- M
a'
должен иметь каждые ненулевая координата.
Таким образом, матрица M
должна принимать вектор с одной ненулевой координатой к одному со всеми ненулевыми координатами. Таким образом, нам просто нужно, чтобы каждая запись M
была ненулевым делителем mod 256, т.е. быть нечетной.
Возвращаясь к условию (1), что означает для M
обратимость? Поскольку мы рассматриваем его мод 256, нам нужно, чтобы его определитель был обратимым модом 256; то есть его определитель должен быть нечетным.
Итак, вам нужна матрица 4x4 с нечетными записями мод 256, чей определитель нечетен. Но это невозможно! Зачем? Определитель вычисляется путем суммирования различных произведений записей. Для матрицы 4х4 их 4! = 24 различных слагаемых, и каждое из них, являющееся произведением нечетных записей, является нечетным. Но сумма 24 нечетных чисел четна, поэтому определитель такой матрицы должен быть четным!