算法概述

  • 加密因子:0xA3
  • 加密算法:将待加密的字符串中的每一个字节,分别与加密因子进行异或,然后将异或后的二进制结果进行高低位交换,然后将交换后的结果转换成2进制字符串。所有的字节转换完成后,将最终的结果base64加密。
  • 解密算法:其实就是加密算法的反向操作。先将加密字符串base64解密,然后字符串的每一个字节(就是上面转的二进制字符串)转换成二进制,再将二进制高低位交换、异或,最后将二进制转换成字符。

具体代码

/**
 * 加密算法
 */
function encrypt($str, $secret)
{
    // 存放结果字符串
    $result = ''; 
    // 加密
    for($i = 0; $i < strlen($str); $i++) {
        // 异或
        $xor = ord($str[$i]) ^ hexdec($secret);
        // 转二进制
        $binary = decbin($xor);
        // 高低位交换
        $reverse = implode('', array_reverse(str_split($binary, 4)));
        // 转换成16进制,如果出现1位的情况,左侧补0
        $encodeData = str_pad(base_convert($reverse, 2, 16), 2, '0', STR_PAD_LEFT);
        // 16进制转二进制字符串
        $result .= pack('H*', $encodeData);
    }
    return base64_encode($result);
}

/**
 * 解密算法
 */
function decrypt($str, $secret)
{
    // 存放结果字符串
    $result = '';
    // 解码base64
    $str = base64_decode($str);
    // 解密
    for($i = 0; $i < strlen($str); $i++) {
        // 二进制字符串转16进制
        $hexadecimal = unpack('H*', $str[$i])[1];
        // 16进制转2进制
        $binary = str_pad(base_convert($hexadecimal, 16, 2), 8, '0', STR_PAD_LEFT);
        // 高低位交换
        $reverse = implode('', array_reverse(str_split($binary, 4)));
        // 异或
        $xor = bindec($reverse) ^ hexdec($secret);
        // 二进制转字符串
        $result .= pack('C', $xor);
    }
    return $result;
}

$result = encrypt('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890~!@#$%^&*()_+-=', 'A3');
$result = decrypt($result, 'A3');

标签: php

添加新评论