理解一下base64算法,一个PHP加解密方法

一、先通过一个PHP加密解密方法来看:

function encrypt($string,$operation,$key='darling'){
    $key=md5($key);
    $key_length=strlen($key);
    $string=$operation=='D'?base64_decode($string):substr(md5($string.$key),0,8).$string;
    $string_length=strlen($string);
    $rndkey=$box=array();
    $result='';
    //获取key中所有字母的ascii码存到randkey数组中
    for($i=0;$i<=255;$i++){
    $rndkey[$i]=ord($key[$i%$key_length]);
    $box[$i]=$i;
    }
    //随机获取新的box的值
    for($j=$i=0;$i<256;$i++){
    $j=($j+$box[$i]+$rndkey[$i])%256;
    $tmp=$box[$i];
    $box[$i]=$box[$j];
    $box[$j]=$tmp;
    }
    for($a=$j=$i=0;$i<$string_length;$i++){
    $a=($a+1)%256;
    $j=($j+$box[$a])%256;
    $tmp=$box[$a];
    $box[$a]=$box[$j];
    $box[$j]=$tmp;
    //主要利用了异或的(a xor b) xor b=a
    $result.=chr(ord($string[$i])^($box[($box[$a]+$box[$j])%256]));
    }
    if($operation=='D'){
    if(substr($result,0,8)==substr(md5(substr($result,8).$key),0,8)){
        return substr($result,8);
    }else{
        return'';
    }
    }else{
        //base64后面的=可以去掉,不影响信息完整性
        return str_replace('=','',base64_encode($result));
    }
}

二、分析

上面的加密方法主要利用了两点,当然主要加密方式其实只有异或的加密,base64相当于格式转换了。注意我上面写的注释是主要的重点部分。

三、base64的几个说明

base64加密主要是将原来的三字节变为四字节,其实也就是用00代替高位,然后这样的话所能代表的只有64个字符,所以可以看到加密结果只有下面的64个字符:

           0 A            17 R            34 i            51 z
           1 B            18 S            35 j            52 0
           2 C            19 T            36 k            53 1
           3 D            20 U            37 l            54 2
           4 E            21 V            38 m           55 3
           5 F            22 W            39 n           56 4
           6 G            23 X            40 o            57 5
           7 H            24 Y            41 p            58 6
           8 I            25 Z            42 q            59 7
           9 J            26 a            43 r            60 8
          10 K            27 b            44 s            61 9
          11 L            28 c            45 t            62 +
          12 M            29 d            46 u            63 /
          13 N            30 e            47 v
          14 O            31 f            48 w         (pad) =
          15 P            32 g            49 x
          16 Q            33 h            50 y

当然=另算,=是base64的最后位数不足的时候的补位,所以不影响数据的完整性。

四、以上方法的使用:

encrypt("待加密字符串");//加密
encrypt("待解密字符串","D");//解密
点赞