一个PHP异或加密算法的case
2016-09-01 13:33:12 小德 PHP 访问次数 1137


加密原理:

    假设你要加密的内容为A,密钥为B,则可以用异或加密:

     加密:C=A^B;

     解密: A=B^C;


function encrypt($string, $key = 'keystring')
    {
        if (!$string) {
            return '';
        }
        //data type
        $string = (string)$string;
        //xor
        $keyLength = strlen($key);
        for ($i = 0; $i < strlen($string); $i++) {
            $position = $i % $keyLength;
            $chr = ord($string[$i]) ^ ord($key[$position]);  //ord()  => 转换成ascii 值 进ASCII值对应的二进制进行异或
            $encodeString[$i] = chr($chr);        // 将ascii 转换成字符
        }
        $string = join($encodeString);
        //base64
        $string = base64_encode($string);        //将字符串进行base64编码  其编码后的只有数字 英文字母 和 +  和 /
        //添加干扰
        $length = rand(2, 9);
        $base64String = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
        $randomString = '';
        for ($i = 0; $i < $length; $i++) {
            $randomString .= $base64String[rand(0, 63)];
        }
        $string = $length . $randomString . $string;
        return $string;
    }


/**
         * 异或(xor)算法解密
         *
         * @param string $string
         * @param string $key
         * @return string
         */
         function decrypt($string, $key = '********')
        {
            
            //data type
            $string = (string)$string;
            //去除干扰
            $length = substr($string, 0, 1);
            $string = substr($string, $length + 1);
            //base64
            $string = base64_decode($string);
            //xor
            $keyLength = strlen($key);
            for ($i = 0; $i < strlen($string); $i++) {
                $position = $i % $keyLength;
                $chr = ord($string[$i]) ^ ord($key[$position]);
                $decodeString[$i] = chr($chr);
            }
            $decodeString = (array)$decodeString;
            $string = join($decodeString);
            return $string;
        }