Вот моя простая идея: вы можете перемещаться по битам числа, как предложил PeterK, но вы можете иметь разную перестановку битов для каждого числа и при этом иметь возможность расшифровать его.
Шифр выглядит следующим образом: обрабатывать входной номер как массив битов I[0..31]
, а выходной - как O[0..31]
.Подготовьте массив K[0..63]
из 64 случайно сгенерированных чисел.Это будет ваш ключ.Возьмите бит входного числа из позиции, определенной первым случайным числом (I[K[0] mod 32]
), и поместите его в начало вашего результата (O[0]
).Теперь, чтобы решить, какой бит поместить в O[1]
, используйте ранее использованный бит.Если оно равно 0, используйте K [1], чтобы сгенерировать позицию в I
, из которой нужно взять, это 1, используйте K [2] (что просто означает пропуск одного случайного числа).
Теперь это не будет хорошо работать, так как вы можете взять один и тот же бит дважды.Чтобы избежать этого, перенумеруйте биты после каждой итерации, пропуская используемые биты.Чтобы сгенерировать позицию, из которой нужно взять O[1]
, используйте I[K[p] mod 31]
, где p равно 1 или 2, в зависимости от бита O[0]
, поскольку осталось 31 бит, пронумерованных от 0 до 30.
Чтобы проиллюстрировать это, я приведу пример:
У нас есть 4-битное число и 8 случайных чисел: 25, 5, 28, 19, 14, 20, 0, 18.
I: 0111 O: ____
_
25 mod 4 = 1, поэтому мы возьмем бит, позиция которого равна 1 (считая от 0)
I: 0_11 O: 1___
_
Мы только что взяли бит значения 1, поэтому мы пропускаем одинслучайное число и использование 28. Осталось 3 бита, поэтому для подсчета позиции мы берем 28 mod 3 = 1. Мы берем первый (считая от 0) из оставшихся бит:
I: 0__1 O: 11__
_
Снова пропускаемодно число, и взять 14. 14 mod 2 = 0, поэтому мы берем 0-й бит:
I: ___1 O: 110_
_
Теперь это не имеет значения, но предыдущий бит был 0, поэтому мы берем 20. 20 mod1 = 0:
I: ____ O: 1101
И это все.
Расшифровать такое число легко, нужно просто сделать то же самое.Позиция, в которой нужно разместить первый бит кода, известна из ключа, следующие позиции определяются ранее вставленными битами.
Это, очевидно, имеет все недостатки всего, что просто перемещает биты (например, 0 становится 0, а MAXINT становится MAXINT), но, кажется, труднее найти, как кто-то зашифровал число, не зная ключа, который должен быть секретным.