微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

php – 加密数字URL参数,结果不应超过原始值

我必须加密特定的URL参数.如果我希望输出低于6-7个字符,我应该使用什么算法?

输入是整数,范围从1到1,000,000.

解决方法:

如果您需要加密并且需要尽可能短的结果,则必须使用流密码. Blowfish(您之前使用过的)是一个阻塞程序,结果将始终具有一个块的最小大小.

PHP manual on mcrypt中找到comparison of stream ciphers on Wikipedia支持的密码列表

此外,加密的结果可能包含特殊字符,因此当将其作为参数放入URL时,您应该使用urlencode()或base64_encode()

使用urlencode()或base64_encode()将扩展您的字符串,使其比原始数据更长.这对于使传输/ URL安全是必要的.

但是,由于您的输入始终是数字,因此您可以使用base_convert()来缩短输入.在解码方面,你必须做同样的事情.

为了获得更短的结果,您可以使用enminicode() / deminicode() function provided by 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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐