XOR算法原理
从加密的主要方法看,换位法过于简单,特别是对于数据量少的情况很容易由密文猜出明文,而替换法不失为一种行之有效的简易算法。
从各种替换法运算的特点看,异或运算最适合用于简易加解密运算,这种方法的原理是:当一个数A和另一个数B进行异或运算会生成另一个数C,如果再将C和B进行异或运算则C又会还原为A。
相对于其他的简易加密算法,XOR算法的优点如下。
(1)算法简单,对于高级语言很容易能实现。
(2)速度快,可以在任何时候、任何地方使用。
(3)对任何字符都是有效的,不像有些简易加密算法,只对西文字符有效,对中文加密后再解密无法还原为原来的字符。
XOR算法实现
上一部分介绍了如何使用XOR运算进行加密/解密的原理,本节将使用其加密用户的登录信息。根据上一小节介绍的XOR加密算法的原理,不难写出以下的加密解密函数。首先列出加密算法。
复制代码 代码如下:
//加密函数
functionmyEncrypt($string,$key)
{
for($i=0;$i
{
for($j=0;$j
{
$string[$i]=$string[$i]^$key[$j];
}
}
return$string;
}
复制代码 代码如下:
//解密函数
functionmyDecrypt($string,$key)
{
for($i=0;$i
{
for($j=0;$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";
复制代码 代码如下:
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);
?>
复制代码 代码如下:
//自动生成长度为$len的密钥
functiongenerate_key($len)
{
$lowerbound=35;
$upperbound=96;
$strMyKey="";
for($i=1;$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);
//*/
?>