PHP的一套位移加密算法
算法概述
- 加密因子: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');