把base64后的字符串转换成小写字母加数字,要可逆哦 base64后的字符串转换成小写字母加数字,必须要可逆,欢迎讨论方法 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 strtolower() //将字符串转换为小写形式 下面是我的加密方式想法,很丑,很肩带的方式,目前很想找到能够美化下的方法,就如楼主所说的,可是我还太菜无法做到,希望看到的能够帮下忙function code($s, $t = 'encode') { if(!isset($_SESSION['code']))$_SESSION['code'] = ''; if($t == 'encode'){ $s = base64_encode($s); $l = strlen($s); for($i = 0; $i < $l; $i++){ $num = microtime() * 1000000; $s[$i] = chr(ord($s[$i]) + $num); $_SESSION['code'][$i] = $num; } return $s; }else{ $l = strlen($s); for($i = 0; $i < $l; $i++){// if(!isset($_SESSION['code'][$i]))die('密码不正确或已过期!'); $s[$i] = chr(ord($s[$i]) - $_SESSION['code'][$i]); } return base64_decode($s); }}$s = '我来也';echo code($s); 我的思路如下:1. 对于生成的BASE64字符串中的非小写字母也非数字的字符进行ascii码值定长位数变换,由于单个字符ascii码最大值为127, 所以对于不足三位值的字符进行补足三位,对于小写字母和数字不进行转换,但是也需要补足三位,解密时按每三位来进行截取,代码实现比较简单;2. 最简单的方式莫过于使用散列加密函数sha1($str); 它返回的值就是小写字母与数字的组合,非常简单:sha1(PHP 4 >= 4.3.0, PHP 5)sha1 — 计算字符串的 sha1 散列值说明string sha1 ( string $str [, bool $raw_output = false ] )利用» 美国安全散列算法 1 计算字符串的 sha1 散列值。 参数str 输入字符串。 raw_output 如果可选的 raw_output 参数被设置为 TRUE,那么 sha1 摘要将以 20 字符长度的原始格式返回,否则返回值是一个 40 字符长度的十六进制数字。 返回值返回 sha1 散列值字符串。 更新日志版本 说明 5.0.0 新增 raw_output 参数。 范例Example #1 sha1() 范例<?php$str = 'apple';if (sha1($str) === 'd0be2dc421be4fcd0172e5afceea3970e2f3d940') { echo "Would you like a green or red apple?";}?> 刚看到还需要可逆,那sha1()就不行了,只能用第一种方法了 服了,我把方法一的代码实现一提交,CSDN就说有非法字符,过滤机制太差了,只能到到我的BLOG里了:大家可以参考一下:关于回答“把base64后的字符串转换成小写字母加数字,要可逆”问题的代码实现 方法一是利用了ASCII码单个字符最大值为127的原理,字符长度是base64加密后的3倍长,应该不会有性能问题,对于超多字符串来说一般也可以用了,暂时没发现有更好的方法,3倍长度应该算是比较少的开销了。 重新发一下地址,UBB的编辑器确实不好用:关于回答“把base64后的字符串转换成小写字母加数字,要可逆”问题的代码实现 的确这个如果要反解真的还不好弄(估计是不可能吧),下面的是我写的,不过也是不能够定长的//目前还不能实现未加密字符串用于解密算法的检测function code($s, $t = 1) { $s .= ''; if($t){ $len = strlen($s); $code = ''; for($i = 0; $i < $len; $i++){ $code .= str_pad(ord($s[$i]), 3, '1', STR_PAD_RIGHT).strlen(ord($s[$i])); } $arr = str_split($code, 4); $code = ''; foreach($arr as $val){ $code .= str_pad(dechex($val), 4, '1', STR_PAD_RIGHT).strlen(dechex($val)); } return $code; }else{ $arr = str_split($s, 5); $code = ''; foreach($arr as $val){ $code .= hexdec(substr($val, 0, $val[strlen($val) - 1])); } $arr = str_split($code, 4); $code = ''; foreach($arr as $val){ $code .= chr(substr($val, 0, $val[strlen($val) - 1])); } return $code; }}$s = rand(0, 9999);echo code($s, 0);exit;echo '随机数:', $s, '<br>加密数:', code($s, 1), '<br>解密后:', code(code($s, 1), 0); 呵呵 ,开始我也在考虑如何处理多字节,但是发现根本没有必要,因为楼主的意思是将已经base64加密后的字符串再转换成只有小写字母和数字的字符串,转换后是不需要去考虑汉字的问题的,因为base64加密后不可能会出现汉字的 我觉得楼主这个题目换一个问法可能就容易思考了,不用局限在对“base64后的字符串”进行转换。base64 是一种编码方式,简单理解就是“64 进制表示法”,这个大家可能都清楚了,所以它需要用 64 个字符来作为“数字”(就像 10 进制需要 10 个数字)。而常规的 base64 编码采用的字符集合是“26 个大写字母 + 26 个小写字母 + 10 个阿拉伯数字 + 加号 + 正斜线”,另外还有一个“等号”作为定界符。针对楼主的题目,我觉得只要仿照 base64 算法的思想,构造一种 base36 就可以了,也就是“36 进制表示法”,字符集合采用“26 个小写字母 + 10 个阿拉伯数字”。当然,为了算法简洁,最好是构造 base32,也就是“32 进制表示法”。事实上,base32 不是我在这里杜撰的,已经有人发明它了 :)BTW: 经常看到有的朋友不是很在意区分“编码算法/加密算法/摘要算法”,其实它们是完全不同的概念,应用场合也各不相同。————————————————————————————————基于CSDN论坛提供的插件扩展功能,自己做了个签名档工具,分享给大家,欢迎技术交流 :) 八楼最佳答案,给错楼了,不过会员没错(csdn的评分功能真不好用) 有人做过用soap调用system命令吗? 屏蔽客户端电脑的问题 php页面如何获取form提交的二维数组中的数据 安装extplorer 求助 php,有什么办法实现整站切换CSS呢? PHP实现全选,删除(更新某一列的值)或者是审核(更新某一列的值) 100分 【急死我了】为何phpexcel在win2003下就是运行不正常呢! 100分求助:PHP如何获取PUT和DELETE请求的参数 macromedia dreamweaver mx 2004 谁用过啊?请教! zabbix 谁能给一个团购网站的那个剩余时间倒记时的代码 php在服务器上执行一个程序
strtolower() //将字符串转换为小写形式
function code($s, $t = 'encode') {
if(!isset($_SESSION['code']))$_SESSION['code'] = '';
if($t == 'encode'){
$s = base64_encode($s);
$l = strlen($s);
for($i = 0; $i < $l; $i++){
$num = microtime() * 1000000;
$s[$i] = chr(ord($s[$i]) + $num);
$_SESSION['code'][$i] = $num;
}
return $s;
}else{
$l = strlen($s);
for($i = 0; $i < $l; $i++){
// if(!isset($_SESSION['code'][$i]))die('密码不正确或已过期!');
$s[$i] = chr(ord($s[$i]) - $_SESSION['code'][$i]);
}
return base64_decode($s);
}
}$s = '我来也';
echo code($s);
对于生成的BASE64字符串中的非小写字母也非数字的字符进行ascii码值定长位数变换,由于单个字符ascii码最大值为127, 所以对于不足三位值的字符进行补足三位,对于小写字母和数字不进行转换,但是也需要补足三位,解密时按每三位来进行截取,代码实现比较简单;2.
最简单的方式莫过于使用散列加密函数sha1($str); 它返回的值就是小写字母与数字的组合,非常简单:
sha1
(PHP 4 >= 4.3.0, PHP 5)sha1 — 计算字符串的 sha1 散列值说明
string sha1 ( string $str [, bool $raw_output = false ] )
利用» 美国安全散列算法 1 计算字符串的 sha1 散列值。 参数str
输入字符串。 raw_output
如果可选的 raw_output 参数被设置为 TRUE,那么 sha1 摘要将以 20 字符长度的原始格式返回,否则返回值是一个 40 字符长度的十六进制数字。
返回值
返回 sha1 散列值字符串。 更新日志
版本 说明
5.0.0 新增 raw_output 参数。
范例Example #1 sha1() 范例<?php
$str = 'apple';if (sha1($str) === 'd0be2dc421be4fcd0172e5afceea3970e2f3d940') {
echo "Would you like a green or red apple?";
}
?>
方法一是利用了ASCII码单个字符最大值为127的原理,字符长度是base64加密后的3倍长,应该不会有性能问题,对于超多字符串来说一般也可以用了,暂时没发现有更好的方法,3倍长度应该算是比较少的开销了。
function code($s, $t = 1) {
$s .= '';
if($t){
$len = strlen($s);
$code = '';
for($i = 0; $i < $len; $i++){
$code .= str_pad(ord($s[$i]), 3, '1', STR_PAD_RIGHT).strlen(ord($s[$i]));
}
$arr = str_split($code, 4);
$code = '';
foreach($arr as $val){
$code .= str_pad(dechex($val), 4, '1', STR_PAD_RIGHT).strlen(dechex($val));
}
return $code;
}else{
$arr = str_split($s, 5);
$code = '';
foreach($arr as $val){
$code .= hexdec(substr($val, 0, $val[strlen($val) - 1]));
}
$arr = str_split($code, 4);
$code = '';
foreach($arr as $val){
$code .= chr(substr($val, 0, $val[strlen($val) - 1]));
}
return $code;
}
}$s = rand(0, 9999);
echo code($s, 0);exit;
echo '随机数:', $s, '<br>加密数:', code($s, 1), '<br>解密后:', code(code($s, 1), 0);
呵呵 ,开始我也在考虑如何处理多字节,但是发现根本没有必要,因为楼主的意思是将已经base64加密后的字符串再转换成只有小写字母和数字的字符串,转换后是不需要去考虑汉字的问题的,因为base64加密后不可能会出现汉字的
————————————————————————————————
基于CSDN论坛提供的插件扩展功能,自己做了个签名档工具,分享给大家,欢迎技术交流 :)