PHP100 2019-03-27
XOR算法原理
从加密的主要方法看,换位法过于简单,特别是对于数据量少的情况很容易由密文猜出明文,而替换法不失为一种行之有效的简易算法。
从各种替换法运算的特点看,异或运算最适合用于简易加解密运算,这种方法的原理是:当一个数A和另一个数B进行异或运算会生成另一个数C,如果再将C和B进行异或运算则C又会还原为A。
相对于其他的简易加密算法,XOR算法的优点如下。
(1)算法简单,对于高级语言很容易能实现。
(2)速度快,可以在任何时候、任何地方使用。
(3)对任何字符都是有效的,不像有些简易加密算法,只对西文字符有效,对中文加密后再解密无法还原为原来的字符。
XOR算法实现
上一部分介绍了如何使用XOR运算进行加密/解密的原理,本节将使用其加密用户的登录信息。根据上一小节介绍的XOR加密算法的原理,不难写出以下的加密解密函数。首先列出加密算法。
代码如下:
<!Cencrypy_xor:简单使用XOR运算的加密函数―――――――C> <?php //加密函数 functionmyEncrypt($string,$key) { for($i=0;$i<STRLEN($STRING);p$i++)<> { for($j=0;$j<STRLEN($KEY);p$j++)<> { $string[$i]=$string[$i]^$key[$j]; } } return$string; }
代码如下:
//解密函数 functionmyDecrypt($string,$key) { for($i=0;$i<STRLEN($STRING);p$i++)<> { for($j=0;$j<STRLEN($KEY);p$j++)<> { $string[$i]=$key[$j]^$string[$i]; } } return$string; } ?>
代码如下:
//示例 $my_password="chair"; echo"my_password=$my_password"; $my_key="1234567890″; $my_password_en=myEncrypt($my_password,$my_key); echo"my_password_en=$my_password_en"; $my_password_de=myDecrypt($my_password_en,$my_key); echo"my_password_de=$my_password_de";
代码如下:
<?php session_start();//装载Session库,一定要放在首行 $user_name=$_POST["user_name"]; session_register(“user_name");//注册$user_name变量,注意没有$符号 require_once(“sys_conf.inc");//系统配置文件,包含数据库配置信息 require_once(“encrypy_xor.php");//包含xor加密函数文件 //连接数据库 $link_id=mysql_connect($DBHOST,$DBUSER,$DBPWD); mysql_select_db($DBNAME);//选择数据库my_chat //查询是否存在登录用户信息 $str="selectname,passwordfromuserwherename='$user_name'"; $result=mysql_query($str,$link_id);//执行查询 @$rows=mysql_num_rows($result);//取得查询结果的记录笔数 $user_name=$_SESSION["user_name"]; $password=$_POST["password"]; $password_en=myEncrypt($user_name,$password);//加密用户信息 //对于老用户 if($rows!=0) { list($name,$pwd)=mysql_fetch_row($result); $password_de=myDecrypt($pwd,$password);//解密用户信息 //如果密码输入正确 if($user_name==$password_de) { $str="updateusersetis_online=1wherename='$user_name'andpassword='$password_en'"; $result=mysql_query($str,$link_id);//执行查询 require(“main.php");//转到聊天页面 } //密码输入错误 else { require(“relogin.php"); } } //对于新用户,将其信息写入数据库 else { $str="insertintouser(name,password,is_online)values(‘$user_name','$password_en',1)"; $result=mysql_query($str,$link_id);//执行查询 require(“main.php");//转到聊天页面 } //关闭数据库 mysql_close($link_id); ?>
代码如下:
<!Ckeygen.php:自动生成密钥――――――――――――> <?php //自动生成长度为$len的密钥 functiongenerate_key($len) { $lowerbound=35; $upperbound=96; $strMyKey=""; for($i=1;$i<=$len;$i++) { $rnd=rand(0,100);//产生随机数 $k=(($upperbound-$lowerbound)+1)*$rnd+$lowerbound; $strMyKey=$strMyKey.$k; } return$strMyKey; } //将密钥写入文件$file_name functionwrite_key($key,$file_name) { $filename="C:\key.txt"; $key=generate_key($key,512); //使用添加模式打开$filename,文件指针将会在文件的末尾 if(!$handle=fopen($filename,'w')) { print"不能打开文件$filename"; exit; } //将$key写入到我们打开的文件中。 if(!fwrite($handle,$key)) { print"不能写入到文件$filename"; exit; } fclose($handle); } //读取密钥文件中的密钥 functionget_key($file_name) { //打开文件 $fp=fopen($file_name,"r"); $result=""; //逐行读取 while(!feof($fp)) { $buffer=fgets($fp,4096); $result=$result.$buffer; } return$result; } ///* $KeyLocation="C:\key.txt";//保存密钥的文件 $key="123456″; write_key($key,$KeyLocation); echoget_key($KeyLocation); //*/ ?>