base64后的字符串转换成小写字母加数字,必须要可逆,欢迎讨论方法

解决方案 »

  1.   


    strtolower()       //将字符串转换为小写形式
      

  2.   

    下面是我的加密方式想法,很丑,很肩带的方式,目前很想找到能够美化下的方法,就如楼主所说的,可是我还太菜无法做到,希望看到的能够帮下忙
    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);
      

  3.   

    我的思路如下: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?";
    }
    ?> 
      

  4.   

    刚看到还需要可逆,那sha1()就不行了,只能用第一种方法了
      

  5.   

    服了,我把方法一的代码实现一提交,CSDN就说有非法字符,过滤机制太差了,只能到到我的BLOG里了:大家可以参考一下:关于回答“把base64后的字符串转换成小写字母加数字,要可逆”问题的代码实现 
      

  6.   


    方法一是利用了ASCII码单个字符最大值为127的原理,字符长度是base64加密后的3倍长,应该不会有性能问题,对于超多字符串来说一般也可以用了,暂时没发现有更好的方法,3倍长度应该算是比较少的开销了。
      

  7.   

    重新发一下地址,UBB的编辑器确实不好用:关于回答“把base64后的字符串转换成小写字母加数字,要可逆”问题的代码实现   
      

  8.   

    的确这个如果要反解真的还不好弄(估计是不可能吧),下面的是我写的,不过也是不能够定长的//目前还不能实现未加密字符串用于解密算法的检测
    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);
      

  9.   


    呵呵 ,开始我也在考虑如何处理多字节,但是发现根本没有必要,因为楼主的意思是将已经base64加密后的字符串再转换成只有小写字母和数字的字符串,转换后是不需要去考虑汉字的问题的,因为base64加密后不可能会出现汉字的
      

  10.   

    我觉得楼主这个题目换一个问法可能就容易思考了,不用局限在对“base64后的字符串”进行转换。base64 是一种编码方式,简单理解就是“64 进制表示法”,这个大家可能都清楚了,所以它需要用 64 个字符来作为“数字”(就像 10 进制需要 10 个数字)。而常规的 base64 编码采用的字符集合是“26 个大写字母 + 26 个小写字母 + 10 个阿拉伯数字 + 加号 + 正斜线”,另外还有一个“等号”作为定界符。针对楼主的题目,我觉得只要仿照 base64 算法的思想,构造一种 base36 就可以了,也就是“36 进制表示法”,字符集合采用“26 个小写字母 + 10 个阿拉伯数字”。当然,为了算法简洁,最好是构造 base32,也就是“32 进制表示法”。事实上,base32 不是我在这里杜撰的,已经有人发明它了 :)BTW: 经常看到有的朋友不是很在意区分“编码算法/加密算法/摘要算法”,其实它们是完全不同的概念,应用场合也各不相同。
    ————————————————————————————————
    基于CSDN论坛提供的插件扩展功能,自己做了个签名档工具,分享给大家,欢迎技术交流 :)
      

  11.   

    八楼最佳答案,给错楼了,不过会员没错(csdn的评分功能真不好用)