我必须加密特定的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 举报,一经查实,本站将立刻删除。