Простое шифрование в PHP

Я создаю систему с исходным кодом, которую я выдаю в сети за предоставление усыновленных виртуальных домашних животных. Система будет принадлежать главным образом детям. Поскольку я хочу, чтобы он был полезен для начинающих программистов, в моей системе есть несколько ограничений сложности: он не может использовать библиотеки, которые обычно не поставляются с PHP, и не может касаться базы данных или записывать в другое постоянное хранилище ,

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

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

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

PHP-библиотека mcrypt, вероятно, будет иметь что-то полезное в ней, но она не кажется очень распространенной среди хостеров.

Есть ли простая, параметризованная, обфускация / шифрование, которую я могу использовать здесь?

Если вы ожидаете относительно низкий уровень сложности, вы можете сделать очень простое шифрование «xor» и «сохранить» ключ как часть URL-адреса. Затем вы можете просто использовать rand () или / dev / random или php для генерации ключей.

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

Edit: Если это не было очевидно, я говорю, что вы даете другой ключ каждому домашнему животному (так как предоставление того же решения не решит вашу проблему). Поэтому, если изменение любимчика (petvar) – это 16-битное число, вы генерируете 16-битное случайное число (rnd), тогда вы делаете это: petvar = (petvar^rnd)<<16 | rnd; petvar = (petvar^rnd)<<16 | rnd; и затем вы можете отменить эту операцию, чтобы извлечь rnd, а затем petvar ^ rnd, а затем просто повторить ее, чтобы получить исходный petvar.

Вы ищете шифрование «одноразового заполнения». Он берет ключ и добавляет модуль к символам для создания зашифрованной строки.

 function ecrypt($str){ $key = "abc123 as long as you want bla bla bla"; for($i=0; $i<strlen($str); $i++) { $char = substr($str, $i, 1); $keychar = substr($key, ($i % strlen($key))-1, 1); $char = chr(ord($char)+ord($keychar)); $result.=$char; } return urlencode(base64_encode($result)); } function decrypt($str){ $str = base64_decode(urldecode($str)); $result = ''; $key = "must be same key as in encrypt"; for($i=0; $i<strlen($str); $i++) { $char = substr($str, $i, 1); $keychar = substr($key, ($i % strlen($key))-1, 1); $char = chr(ord($char)-ord($keychar)); $result.=$char; } return $result; } 

Так что это простое строковое шифрование. Я бы сделал сериализацию массива параметров пользователя и передал его как переменную в ссылке:

 $arr = array( 'pet_name'=>"fido", 'favorite_food'=>"cat poop", 'unique_id'=>3848908043 ); $param_string = encrypt(serialize($arr)); $link = "/load_pet.php?params=$param_string"; 

В load_pet.php вы должны сделать обратное:

 $param_string = $_GET["params"]; $params = unserialize(decrypt($param_string)); 

Bam.

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