Один очень простой способ сделать это с помощью модульного мультипликативного обратного, как я опишу в своем блоге здесь: http://blog.mischel.com/2017/06/20/how-to-generate-random-looking-keys/.
Идея состоит в том, что вы отображаете числа от 1 до некоторого числа x, чтобы каждое число генерировало уникальное значение в этом же диапазоне. Так, например, сопоставление может быть:
1 -> 9875
2 -> 362
3 -> 5247
...
Это обратимый расчет. Так что если f (1) => 9875, то g (9875) => 1.
В коде, показанном в сообщении в блоге, вы можете изменить отображение, изменив значения x
и m
.
Если вы хотите, чтобы ключи были буквенно-цифровыми, вам нужно их кодировать после генерации целого числа. И тогда вам нужно будет декодировать их обратно в целое число после того, как пользователь введет его, и перед тем, как попытаться проверить.
Итак, для вашей проверки установите m
на очень большое число. Установите x
соответственно, предпочтительно простое число больше m
. Сгенерируйте первые 10000 ключей, используя эти значения. На устройстве, которое должно проверять эти числа, просто введите значения x
и m
и максимальный индекс (т. Е. 10 000).
Таким образом, пользователь вводит ключ, который ему дали. Вы запускаете обратную генерацию ключа и получаете число от 1 до 10000. Вы знаете, что номер действителен. Если ваш обратный расчет возвращает число, которое меньше 1 или больше 10 000, этот ключ недействителен.
Вы можете расширить это на несколько устройств, просто указав каждому устройству начальные и конечные значения, которые оно считает действительными. Расчет обратного ключа одинаков, независимо.
Эта техника обеспечивает уникальность. Безопасность ... в основном через безвестность. Если кто-то знает используемый алгоритм, включая значения x
и m
, и знает диапазон чисел, которые устройство должно принимать, то он может сгенерировать ключи, чтобы победить систему. Является ли это проблемой - это то, на что только вы можете ответить. Каков риск того, что кто-то попытается победить вашу систему, и какова цена, если он добьется успеха?