简单的异或加密解密算法

作者:LuckyMoke 时间:2015-04-14

写在最前

这篇文章主要介绍了针对于项目开发中对于一些get参数和表单提交的处理方法,目的是不让参数以及进行表单提交时数据过分的暴露,整个加密过程通过异或的方法处理所提交的参数和数据,第一次加密是和随机的混淆字符 第二次则是和用户定义的key值,解密过程相同,只是为了完成相应的业务逻辑。这种方法简单也可以封装成类库在框架中使用,可自己在本地测试,接下来我们来实际的操作吧:

代码示例

<?php
/** 
 *@autor:chunrui :hongdachun 
 *@date :2015.04.13
 *@introduce:比较实用的简单算法介绍
 *①简单加密算法:按位异或(xor) 进行加密解密
 **/
//加密
function passport_encrypt($param,$key) {  
    $encrypt_key = md5(rand(0,32000));//得到一个随机的字符串,生成一个32位的加密混淆字符串
    $ctr = 0;
    $tmp = '';
    $long = strlen($param);//得到$param的长度 
    $keylong = strlen($encrypt_key);//得到encrypt_key 混淆字符串的长度
    //循环
    for($i=0;$i<$long;$i++) {   
	$ctr = $ctr == $keylong ? 0:$ctr;//如果ctr满32 置0 
	//tmp 使用混淆字符串的第ctr个字符链接第一个加密字节和混淆字符串的第ctr++个字节的异或结果
	$tmp .= $encrypt_key[$ctr].($param[$i]^$encrypt_key[$ctr++]); 
    }     
    return base64_encode(passport_key($tmp,$key));//将结果和用户的key再次异或然后进行编码
}

//解密
function passport_decrypt($param,$key) {
    //首先进行解码 然后将结果进行第二次异或还原(这时param变量会变为第一次异或前的结果 ==加密时的$tmp)
    $param = passport_key(base64_decode($param),$key);
    $tmp = '';
    $long = strlen($param);
    for($i=0;$i<$long;$i++) {
	$md5 = $param[$i];  //变量中隐含的异或字符;
	$tmp .=$param[++$i] ^ $md5; //然后异或 解密
    }
    return $tmp;
}
//对数据的处理的方法
function passport_key($param,$encrypt_key)
{
    $encrypt_key = md5($encrypt_key); 
    $ctr = 0;
    $tmp = ''; 
    $long = strlen($param);
    $keylong = strlen($encrypt_key);
    for($i=0;$i<$long;$i++) {
        $ctr = $ctr == $keylong ?0:$ctr;
        $tmp .=$param[$i]^$encrypt_key[$ctr++];
    }
    return $tmp;
}
//测试
$param = array('id'=>12,'name'=>'chunrui');
$param = json_encode($param);
$key = '20150413';
//加密
$crypt = passport_encrypt($param,$key);
var_dump($crypt);
echo '<br>';
//解密
$param = 'VCtdeF09ATMBdFw9UG5TY1pzVnQEYFNjV2lRbgYhXTpXcQdjXD1XdAU8CyJULgVuWn0Heg==';
$dcrypt = passport_decrypt($param,$key);
var_dump($dcrypt);

Tips

GitHubLuckyMoke

Weibokeailvyou

QQ839488083

米拓交流群

模板有不完善的地方欢迎指正!

1511438794807394.jpg