Подтвердить что ты не робот

Obscure/encrypt номер заказа в качестве другого номера: симметричный, "случайный" внешний вид?

Клиент имеет простое увеличение номера заказа (1, 2, 3...). Он хочет, чтобы конечные пользователи получали "случайный" номер 8 или 9 цифр (цифры - без символов). Очевидно, что это "случайное" число фактически должно быть уникальным и обратимым (это действительно шифрование actualOrderNumber).

Моя первая мысль состояла в том, чтобы просто перетасовать несколько бит. Когда я показал клиенту пример последовательности, он жаловался, что последующие obfuscOrderNumbers увеличивались до тех пор, пока они не попали в точку "перетасовки" (точка, в которой играли младшие разряды). Он хочет, чтобы obfuscOrderNumbers были как можно более случайными.

Моя следующая мысль состояла в том, чтобы детерминировать семенной линейный конгруэнтный генератор псевдослучайных чисел, а затем принять значение actualOrderNumber th. Но в этом случае мне нужно беспокоиться о столкновениях - клиент хочет алгоритм, который гарантированно не столкнется, по крайней мере, в течение 10 ^ 7 циклов.

Моя третья мысль была "ах, просто зашифруйте чертовую вещь", но если я использую библиотеку шифрования запаса, мне придется ее обработать, чтобы получить только 8 или 9 цифр.

Моя четвертая мысль заключалась в том, чтобы интерпретировать биты actualOrderNumber как целое число с серым кодом и вернуть это.

Мой пятый, хотя был: "Я, наверное, слишком задумываюсь об этом. Держу пари, кто-то из StackOverflow может сделать это в нескольких строках кода".

4b9b3361

Ответ 1

Будет ли клиент требовать, чтобы распределение запутанных последовательных номеров заказов выглядело как что-нибудь в частности?

Если вы не хотите усложнять себе шифрование, используйте комбинацию бит-перетасовки с небольшим количеством случайных засолов (если у вас есть запасные части/цифры) XOR-накладывается на некоторую фиксированную константу (или какую-то функцию чего-то, что были бы легко доступны вместе с обфускационным идентификатором заказа в любое время, например, возможно, customer_id, который разместил заказ?)


ИЗМЕНИТЬ

Похоже, что все желания клиента для сторонней стороны не могут сделать вывод о прогрессе продаж. В этом случае решение перетасовки (битовое сопоставление, например, исходный бит 1, сопоставляется с запутанным битом 6, исходные биты 6 с обфускацией бит 3 и т.д.) Должно быть более чем достаточно. Добавьте некоторые случайные биты, если вы действительно хотите, чтобы это было труднее взломать, при условии, что у вас есть дополнительные биты (например, если исходные порядковые номера идут только до 6 цифр, но вам разрешено 8-9 в номере с запутанным порядком, то вы можете использовать 2-3 цифры для случайности перед выполнением битового сопоставления). Вероятно, XOR - результат для дополнительного запугивания (любознательная сторона может попытаться создать два последовательных запутанных ордера, XOR их друг против друга, чтобы избавиться от константы XOR, и затем должна была бы определить, какой из ненулевых битов приходится на соль, и какие из них пришли с приростом, и действительно ли он получил два последовательных номера заказа или нет... Он должен был бы повторить это для значительного числа того, что он надеялся, это порядковые номера заказов, чтобы взломать его.)


EDIT2

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

Ответ 2

Выберите 8 или 9-значное число в случайном порядке, скажем, 839712541. Затем возьмите двоичное представление номера заказа (для этого примера я не использую 2 дополнения), отложите его до того же количества бит (30), отмените его, и xor измененный номер заказа и магическое число. Например:

1         = 000000000000000000000000000001

Flip      = 100000000000000000000000000000
839712541 = 110010000011001111111100011101
XOR       = 010010000011001111111100011101 = 302841629

2         = 000000000000000000000000000010

Flip      = 010000000000000000000000000000
839712541 = 110010000011001111111100011101
XOR       = 100010000011001111111100011101 = 571277085

Чтобы вернуть номера заказов, xor номер выхода с вашим магическим числом, конвертировать в битовую строку и наоборот.

Ответ 4

В 9-значном номере первая цифра представляет собой случайный индекс между 0 и 7 (или 1-8). Поместите другую случайную цифру в эту позицию. Остальное - это номер реального заказа:

  • Порядок оригинала: 100
  • Случайный индекс: 5
  • Случайная цифра: 4 (гарантировано, свернуто кости:))
  • Результат: 500040100

  • Orig Nr: 101

  • Случайный индекс: 2
  • Случайная цифра 6
  • Результат: 200001061

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

Или, если вы можете жить с реальными номерами порядка 6 цифр, тогда вы также можете ввести "вторичный" индекс. И вы можете изменить порядок цифр в "реальном" порядке nr.

Ответ 5

Я видел это довольно поздно, (!), следовательно, мой довольно запоздалый ответ. Это может быть полезно для других, следующих позже.

Вы сказали: "Моя третья мысль была" ах, просто зашифруйте чертовую вещь ", но если я использую библиотеку шифрования запаса, мне пришлось бы ее обработать, чтобы получить только 8 или 9 цифр."

Это правильно. Шифрование является обратимым и гарантировано уникальным для данного входа. Как вы указываете, большинство стандартных шифров не имеют нужного размера блока. Тем не менее, есть Hasty Pudding Cipher, который может иметь любой размер блока от 1 бит вверх.

В качестве альтернативы вы можете написать свой собственный. Учитывая, что вам не нужно что-то, что NSA не может взломать, вы можете создать простой шифр Feistel для удовлетворения ваших потребностей.

Ответ 6

Если ваш Идентификатор заказа уникален, просто вы можете сделать префикс и добавить/смешать этот префикс с вашим идентификатором заказа.

Что-то вроде этого:

long pre = DateTime.Now.Ticks % 100;
string prefix = pre.ToString();
string number = prefix + YOURID.ToString()

Ответ 7

<?PHP 

$cry = array(0=>5,1=>3,2=>9,3=>2,4=>7,5=>6,6=>1,7=>8,8=>0,9=>4);

function enc($e,$cry,$k){
    if(strlen($e)>10)die("max encrypt digits is 10");
    if(strlen($e) >= $k)die("Request encrypt must be lesser than its length");
    if(strlen($e) ==0)die("must pass some numbers");

    $ct =  $e;
    $jump = ($k-1)-strlen($e);
    $ency = $cry[(strlen($e))];
    $n = 0;
    for($a=0;$a<$k-1;$a++){
        if($jump > 0){
            if($a%2 == 1){
                $ency .=rand(0,9);
                $jump -=1;
            }else{
                if(isset($ct[$n])){
                    $ency.=$cry[$ct[$n]];
                    $n++;
                }else{
                    $ency .=rand(0,9);
                    $jump -=1;
                }
            }
        }else{
            $ency.= $cry[$ct[$n]];
            $n++;
        }
    }
    return $ency;
}

function dec($e,$cry){
    //$decy = substr($e,6);
    $ar = str_split($e,1);
    $len = array_search($ar[0], $cry);
    $jump = strlen($e)-($len+1);
    $val = "";
    for($i=1;$i<strlen($e);$i++){
        if($i%2==0){
            if($jump >0){
                //$val .=array_search($e[$i], $cry);
                $jump--;
            }else{
                $val .=array_search($e[$i], $cry);
            }
        }else{
            if($len > 0){
                $val .=array_search($e[$i], $cry);
                $len--;
            }else{
                $jump--;
            }
        }
    }
    return $val;
}
if(isset($_GET["n"])){
    $n = $_GET["n"];
}else{
    $n = 1000;
}

$str = 1253;
$str = enc($str,$cry,15);
echo "Encerypted Value : ".$str ."<br/>";
$str = dec($str,$cry);
echo "Decrypted Value : ".$str ."<br/>";
?>