Если вам требуется шифрование и вы хотите получить максимально короткий результат, вы должны использовать потоковый шифр. Blowfish (то, что вы использовали ранее) является блочным шифром, и результат всегда будет иметь минимальный размер одного отдельного блока.
Найдите сравнение потоковых шифров в Википедии и список поддерживаемых шифров в руководстве PHP для mcrypt
Кроме того, результат шифрования может содержать специальные символы, поэтому при помещении его в URL-адрес в качестве параметра следует использовать urlencode()
или base64_encode()
Использование urlencode()
или base64_encode()
расширит вашу строку, сделав ее длиннее исходных данных. Это необходимо для обеспечения безопасности транспорта / URL.
Однако, поскольку ваш ввод всегда является числом, вы можете использовать base_convert()
, чтобы сократить ввод. На стороне декодирования вы должны сделать то же самое.
Чтобы получить еще более короткие результаты , вы можете использовать функцию enminicode()
/ deminicode()
, предоставленную Aron Cederholm вместо использования base_convert()
.
Вот пример использования потокового шифра RC4 (который, кстати, не очень силен) и преобразования из базы 10 в базу 36.
ПРИМЕЧАНИЕ: этот пример работает только с числами, поэтому он использует base_convert()
для сжатия входной строки!
function my_number_encrypt($data, $key, $base64_safe=true, $shrink=true) {
if ($shrink) $data = base_convert($data, 10, 36);
$data = @mcrypt_encrypt(MCRYPT_ARCFOUR, $key, $data, MCRYPT_MODE_STREAM);
if ($base64_safe) $data = str_replace('=', '', base64_encode($data));
return $data;
}
function my_number_decrypt($data, $key, $base64_safe=true, $expand=true) {
if ($base64_safe) $data = base64_decode($data.'==');
$data = @mcrypt_encrypt(MCRYPT_ARCFOUR, $key, $data, MCRYPT_MODE_STREAM);
if ($expand) $data = base_convert($data, 36, 10);
return $data;
}
$data = "15231223";
$key = "&/ASD%g/..&FWSF2csvsq2we!%%";
echo "data: ", $data, "\n";
$encrypted = my_number_encrypt($data, $key);
echo "encrypted: ", $encrypted, "\n";
$decrypted = my_number_decrypt($encrypted, $key);
echo "decrypted: ", $decrypted, "\n";
Результат:
data: 15231223
encrypted: BuF3xdE
decrypted: 15231223