Я пытаюсь обфускать/зашифровать число в строку, а затем снова хочу де-ubfuscate/decrypt эту строку, чтобы получить число.PHP Пользовательское двухстороннее шифрование и дешифрование, что я делаю неправильно?
Я не могу использовать base64 или любые другие общедоступные алгоритмы, поскольку сгенерированный хеш будет личным и конкретным для каждого пользователя и не может использоваться другими пользователями, для создания личных URL-адресов, которые будут содержать личный хэш.
В принципе, я хочу генерировать хэш из userid, поскольку userid уникален и не изменяется.
до сих пор я создал пользовательскую функцию для шифрования идентификатора пользователя и получения хэша из него.
<?php
$base_encryption_array = array(
'0'=>'b76',
'1'=>'d75',
'2'=>'f74',
'3'=>'h73',
'4'=>'j72',
'5'=>'l71',
'6'=>'n70',
'7'=>'p69',
'8'=>'r68',
'9'=>'t67',
'a'=>'v66',
'b'=>'x65',
'c'=>'z64',
'd'=>'a63',
'e'=>'d62',
'f'=>'e61',
'g'=>'h60',
'h'=>'i59',
'i'=>'j58',
'j'=>'g57',
'k'=>'f56',
'l'=>'c55',
'm'=>'b54',
'n'=>'y53',
'o'=>'w52',
'p'=>'u51',
'q'=>'s50',
'r'=>'q49',
's'=>'o48',
't'=>'m47',
'u'=>'k46',
'v'=>'i45',
'w'=>'g44',
'x'=>'e43',
'y'=>'c42',
'z'=>'a41'
);
function my_custom_encode($string){
global $base_encryption_array ;
$string = (string)$string;
$length = strlen($string);
$hash = '';
for ($i=0; $i<$length; $i++) {
if(isset($string[$i])){
$hash .= $base_encryption_array[$string[$i]];
}
}
return $hash;
}
function my_custom_decode($hash){
global $base_encryption_array ;
/* this makes keys as values and values as keys */
$base_encryption_array = array_flip($base_encryption_array);
$hash = (string)$hash;
$length = strlen($hash);
$string = '';
for ($i=0; $i<$length; $i=$i+3) {
if(isset($hash[$i]) && isset($hash[$i+1]) && isset($hash[$i+2]) && isset($base_encryption_array[$hash[$i].$hash[$i+1].$hash[$i+2]])){
$string .= $base_encryption_array[$hash[$i].$hash[$i+1].$hash[$i+2]];
}
}
return $string;
}?>
до сих пор все работает нормально. шифрование работает отлично для нескольких уровней/итераций.
Расшифровка нескольких итерированных хэшей не работает, она работает только для одного зашифрованного значения, а не для 2-х раз зашифрованных значений.
например. моя функция php для создания нескольких итерированных хэшей из userid, я использую 2 раза шифрование, подобное этому.
<?php
function userid_to_hash($userid){
for($i = 1; $i <= 2; $i++) {
$userid = my_custom_encode($userid);
}
/* it returns hash*/
return $userid;
}?>
и моя нескольких итераций функция декодирования
позволяет говорить Идентификатор_пользователь = 41;
так, когда я это сделать
<?php
$userid = 41;
echo userid_to_hash($userid)."<br>";
?>
я получить выходной
g57p69f74a63p69l71
, но когда я хочу, чтобы расшифровать хэш и получить идентификатор пользователя, я получаю пустое пространство. например
<?php
$hash = 'g57p69f74a63p69l71';
echo hash_to_userid($hash);
?>
Я получаю пустую белую страницу. но если я установил $ хэш на одноуровневое дешифрование, как это, и воспользуюсь специальной функцией my_custom_decode, тогда он отлично работает для одиночной итерации.
<?php
$hash = 't67';
echo my_custom_decode($hash);
?>
дает правильный выход.
Вы находитесь в цикле my_custom_decode, похоже, что вы рискуете индексировать за пределы. Если вы получаете пустую белую страницу, опубликуйте исключение, заброшенное в журналы. Я предполагаю, что это «Вне исключения границ». Если длина строки не является модулем 3 == 0, то вы нажмете ее во время одного из ваших вызовов $ hash [$ i + n]. – eggmatters
Я не думаю, что вы понимаете, насколько ЛЕГКО было бы для кого-то расшифровать это «шифрование». Это совершенно небезопасно. Вы просто выполняете перевод персонажей. Вероятно, вы можете переписать всю свою функцию с помощью [strtr] (http://www.php.net/strtr), которая делает именно то, что делает ваш цикл/concat. –
* «Я получаю пустую белую страницу» * - Добавить отчет об ошибках в верхней части файла (ов) сразу после открытия PHP-тега например ' php error_reporting (E_ALL); ini_set ('display_errors', 1); 'тогда остальная часть вашего кода, чтобы убедиться, что он что-то дает. –