Вот моя простая идея: вы можете перемещать биты числа, как предложил 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 по модулю 3 = 1. Берем первое (считая с 0) число оставшиеся биты:
I: 0__1 O: 11__
_
Снова пропускаем одно число и берем 14. 14 mod 2 = 0, поэтому берем 0-й бит:
I: ___1 O: 110_
_
Сейчас уже не важно, но предыдущий бит был 0, поэтому берем 20. 20 mod 1 = 0:
I: ____ O: 1101
И это все.
Расшифровать такой номер несложно, нужно лишь проделать те же действия. Позиция, в которую нужно поместить первый бит кода, известна из ключа, следующие позиции определяются ранее вставленными битами.
Это, очевидно, имеет все недостатки всего, что просто перемещает биты (например, 0 становится 0, а MAXINT становится MAXINT), но кажется труднее найти, как кто-то зашифровал число, не зная ключа, который должен быть секретным.
person
Michał Trybus
schedule
01.07.2010