现在位置: 首页  >  编程技术  >  PHP
任意进制转换,配合 mb_ord() 可实现逐字加密
0 740

任意进制转换,只要把字典字符集填充够长,顺序打乱,配合 mb_ord() 可实现逐字加密。

function baseConvert($num,$fromBase=10,$toBase=95) {
    if ($fromBase!=10){
        $num=baseConvertReverse($num.'',$fromBase,10)*1;
    }
    $chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz!\"#%&$\')*(,-+./:<=>;?@[\]^_}`|{~";
    $result = '';
    while(1) {
        $remainder = $num % $toBase;
        $result = $chars[$remainder] . $result;
        $num = intdiv($num, $toBase);
        if($num==0){break;}
    }
    return $result;
}

function baseConvertReverse($str, $fromBase=95, $toBase=10) {
    $chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz!\"#%&$\')*(,-+./:<=>;?@[\]^_}`|{~";
    $len   = strlen($str);
    $num   = 0;
    for($i=0;$i<$len;$i++) {
        $pos = strpos($chars,$str[$i]);
        $num = $num * $fromBase + $pos;
    }
    if ($toBase!=10){
        $num=baseConvert($num,10,$toBase);
    }
    return $num;
}

// 任意进制
function superBaseConvert($code,$fromBase=10,$toBase=95) {
    $chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz!\"#%&$\')*(,-+./:<=>;?@[\]^_}`|{~";
    $code=$code.'';

    // 从N进制转为十进制
    if ($fromBase!=10){
        $len   = strlen($code);
        $dec   = 0;
        for($i=0;$i<$len;$i++) {
            $pos = strpos($chars,$code[$i]);
            $dec = $dec * $fromBase + $pos;
        }
    }else{
        $dec=$code;
    }

    // 从十进制转为N进制
    if ($toBase==10){
        return $dec;
    }
    $result = '';
    while(true) {
        $remainder = $dec % $toBase;
        $result = $chars[$remainder] . $result;
        $dec = intdiv($dec, $toBase);
        if($dec==0){break;}
    }
    return $result;
}


 评论
 站内搜索