Запутывание удостоверения личности - PullRequest
80 голосов
/ 18 декабря 2011

Я ищу способ зашифровать / скрыть целочисленный идентификатор в другое целое число.Точнее, мне нужна функция int F(int x), чтобы

  • x <-> F (x) было взаимно-однозначным соответствием (если x! = Y, F (x)! =F (y))
  • с учетом F (x), легко найти x - поэтому F не является хеш-функцией
  • с учетом x и F (x) трудно / невозможно найтивне F (y), что-то вроде x ^ 0x1234 не будет работать

Для ясности, я не ищу надежного решения для шифрования, это только запутывание.Представьте себе веб-приложение с URL-адресами, такими как example.com/profile/1, example.com/profile/2 и т. Д. Сами профили не являются секретными, но я бы хотел, чтобы случайные вуайеристы не просматривали / выбирали все профили один за другим, поэтому я бы предпочел скрыть ихчто-то вроде example.com/profile/23423, example.com/profile/80980234 и т. д. Хотя токены, хранящиеся в базе данных, могут выполнять работу довольно легко, мне любопытно, есть ли для этого какая-то простая математика.

Одно важное требование, которое я не поняло том, что результаты должны выглядеть "случайными", то есть, если последовательность x,x+1,...,x+n, F(x),F(x+1)...F(x+n) не должна образовывать прогрессию любого вида.

Ответы [ 11 ]

1 голос
/ 19 декабря 2011

Не уверен, насколько «тяжелым» он вам нужен, как быстро или как мало памяти для использования. Если у вас нет ограничений памяти, вы можете составить список всех целых чисел, перемешать их и использовать этот список в качестве отображения. Однако даже для 4-байтового целого вам потребуется много памяти.

Однако это можно сделать меньшим, поэтому вместо отображения всех целых чисел вы должны отобразить только 2 (или худший случай 1) байта и применить это к каждой группе в целом числе. Таким образом, используя 2 байта, целое число будет равно (group1) (group2) , вы будете отображать каждую группу через случайную карту. Но это означает, что если вы измените только group2, то сопоставление для group1 останется прежним. Это можно «исправить», сопоставляя разные биты каждой группе.

Итак, * (group2) может быть (бит 14,12,10,8,6,4,2,0), поэтому добавление 1 приведет к изменению group1 и group2 .

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

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