看了一下《PHP加密解密内部算法》这个可以说是可逆的加密算法,利用了key + 按位或运算夹杂了字符串,再base64生存暗码。
这个加密解密源码是discuz 里带有的,我找了下是在 global.func.php下,
已经过
passport_encrypt($txt, $key) 更名为:xconvert_encrypt($txt, $key) 了
因为是可逆的加密算法,所以在不知道key的环境下很难从中破解其内容。小表明下这个好用的函数:
function passport_encrypt($txt, $key) { srand((double)microtime() * 1000000); $encrypt_key = md5(rand(0, 32000)); //生成随机数字并md5的key $ctr = 0; $tmp = ''; for($i = 0;$i < strlen($txt); $i++) { //将随机key长度与原文长度一样 $ctr = $ctr == strlen($encrypt_key) ? 0 : $ctr; $tmp .= $encrypt_key[$ctr] . ($txt[$i] ^ $encrypt_key[$ctr++]); // 随机key + 随机key和密文按位或运算的字符串 隔一位插入随机key } return base64_encode(passport_key($tmp, $key)); //再次利用 $key 和 $tmp 再次按位或运算 并返回base64数据 } function passport_decrypt($txt, $key) { $txt = passport_key(base64_decode($txt), $key); //先base64解码 再按位或解密 $tmp = ''; for($i = 0;$i < strlen($txt); $i++) { $md5 = $txt[$i]; $tmp .= $txt[++$i] ^ $md5; //按位或解密 } return $tmp; } function passport_key($txt, $encrypt_key) { $encrypt_key = md5($encrypt_key); $ctr = 0; $tmp = ''; for($i = 0; $i < strlen($txt); $i++) { //按位或加密进程,同上 $ctr = $ctr == strlen($encrypt_key) ? 0 : $ctr; $tmp .= $txt[$i] ^ $encrypt_key[$ctr++]; // } return $tmp; }
“按位或运算”是何物,我使出36K钛合金狗眼百度一下,发明百度百科的中就有;“按位或运算例子——我想对mm说”
引用原文:
xor运算的逆运算是它自己,也就是说两次异或同一个数最后功效稳定,即(a xor b) xor b = a。 xor运算可以用于简朴的加密,好比我想对我MM说1314520,但怕别人知道,于是两边约定拿我的生日19880516作为密钥。1314520 xor 19880516 = 20665500,我就把20665500汇报MM。MM再次计较20665500 xor 19880516的值,获得1314520,于是她就大白了我的诡计。
xor 就是按位或运算,php中的是 “ ^ ”标记
简朴总结为
加密方:原文 ^ 密钥 = 密文
解密方:密文 ^ 密钥 = 原文
xor运算可以用于简朴的加密
有一点是要留意的,按位或要求密钥的长度必需和原文一样长, strlen(原文) == strlen(密钥)
所以就用个轮回判定,当随机key小于密文长度时,再次以随机key填充
在php下 发明 原文 ^ 密钥 = 密文 后,密文根基是乱码,这个不能在网络上传输,所以再次利用base64编码,利便存储传输。
知道根基进程进程了,看下以上php源码加密算法,
加密进程:base64_encode((隔断位插入随机key(原文 ^ 随机key))) ^ key) = 密文
解密进程:(去除隔断位的key(base64_decode(密文) ^ key)) ^ 随机key = 原文
隔断位插入key的浸染就是让密文看起来有随机性。由此我又想到百度url加密的一些道理了,惋惜百度url又更新了。。。