Очередная запутанность номера для сайта-головоломки - PullRequest
1 голос
/ 02 января 2012

Я работаю над сайтом, который генерирует случайную головоломку, и точную головоломку можно воссоздать, используя это число. Поэтому я даю им URL-адрес головоломки, если они захотят поделиться ею с другом или решить ее позже и т. Д.

Чего я не хочу, так это разоблачить, как создается головоломка. Например, девятая цифра может быть от 0 до 3 и определяет поворот головоломки.

Если я просто использую его «как есть», то пользователь может изменить одну цифру в URL, посмотреть, что изменится, и в конечном итоге узнать, как я делаю свою головоломку. Я также не возражал бы, если бы мой номер был меньше, так как мне не нужно все время до 9:

цифры с 1 по 8 [возможные значения от 0 до 5]

цифра 9 [значение от 0 до 3]

цифры с 11-го по 20-й представляют порядок расположения 10 объектов. Я мог бы просто указать первые 9 объектов по порядку, а затем не упомянутый элемент считается последним. (что позволяет использовать до 9 цифр)

Я мог бы изменить основание или использовать альфа-символы в своем URL-адресе в дополнение к цифрам, но некоторые альфа-символы всегда вызывают проблемы - строчные буквы "L" и "1" легко смешиваются, а "o" и ноль тоже могут .

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

Ответы [ 3 ]

2 голосов
/ 02 января 2012

Давайте посмотрим ... довольно наивный подход будет следующим: назначьте каждому значению столько битов, сколько необходимо для его хранения. То есть у вас будет восемь 3-битных значений, одно 2-битное значение и десять 4-битных значения. Это 8 * 3 + 2 + 10 * 4 = 66 бит. Ну, если вы пропустите этот последний, вы получите 62 бита. Вы можете получить его еще меньше, но это становится излишне сложным.

Во всяком случае.

Просто возьмите любой стандартный алгоритм шифрования и примените его к этим 62 битам. Отраслевой стандарт AES (он же Rijndael) работает с 128-битными блоками, которые могут быть слишком длинными - или, возможно, нет, в зависимости от ваших предпочтений. 3DES не будет хуже для ваших целей и работает на 64-битных блоках, что просто идеально.

Когда у вас есть зашифрованные 64 или 128 бит, просто закодируйте их в шестнадцатеричном формате и укажите URL. Если это 64 бит, у вас будет 16 шестнадцатеричных символов. Не очень много. И в любом случае вам будет трудно спуститься. Кроме того, он использует только 0-9, A-F, и есть небольшая вероятность путаницы при звонке по телефону. Не то чтобы люди часто делятся ссылками в наши дни. : P

1 голос
/ 02 января 2012

Ваш номер имеет размер около 18 цифр или около 61-62 бит.Это означает, что он хорошо поместится в одном блоке DES (8 байт или 64 бита).Если вы зашифруете его в режиме ECB, вы получите 64-битное значение, которое выглядит как случайное значение.Вы можете оставить ключ на сервере.Одного 8-байтового ключа DES должно быть достаточно для запутывания, но вы также можете использовать 16/24-байтовый ключ для шифрования DESede.

Итак: при создании новой случайной головоломки: создайте свое число, преобразуйте его в байтмассив длиной 8 байт (или N * 8 байт, если ваше число становится слишком большим), затем зашифруйте его с помощью одного ключа, хранящегося на сервере (8, 16 или 24 случайно сгенерированных байтов) и некоторой резервной копии.Результат будет снова 8 байтов, которые вы можете преобразовать в число из примерно 20 цифр.Если пользователь вводит ранее сгенерированное число, вы можете расшифровать его с помощью ключа на сервере, вернуть полученные байты обратно в число, использованное для создания головоломки.

Обратите внимание, что если пользователь просто вводит какое-то случайное число, он все равно будет расшифрован, поэтому вы можете проверить правильность полученного числа (например, проверить, действительно ли цифра равна 0..3, а не что-то еще).

0 голосов
/ 02 января 2012

Другим подходом к решению этой проблемы будет сохранение внутренних головоломок и привязка головоломки к уникальному идентификатору.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...