PHP加密解密内部算法详解

作者:enenba | 发表于:2013-06-28 10:50 | 分类:php源码

看了一下《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填充

for($i = 0;$i < strlen($txt); $i++) {
	$ctr = $ctr == strlen($encrypt_key) ? 0 : $ctr;
	...
}


在php下 发现 原文 ^ 密钥 = 密文 后,密文基本是乱码,这个不能在网络上传输,所以再次使用base64编码,方便存储传输。


知道基本过程过程了,看下以上php源码加密算法,
加密过程:base64_encode((间隔位插入随机key(原文 ^ 随机key))) ^ key) = 密文
解密过程:(去除间隔位的key(base64_decode(密文) ^ key)) ^ 随机key = 原文


间隔位插入key的作用就是让密文看起来有随机性。由此我又想到百度url加密的一些原理了,可惜百度url又更新了。。。

上一篇: php base64_encode 在url编码上应用   |   下一篇:标题相似比查询 emlog插件» 标签: php源码 PHP加密 解密 算法

评论:

2013-07-02 18:21

时间的流逝,那些年我们折腾博客的精力渐渐消失了。还是坚持保持一份创作精力吧

2013-06-28 17:58

果然是高手,呵呵。