仓酷云

标题: PHP网页编程之PHP+MySQL使用中利用XOR运算加密算法 [打印本页]

作者: 小魔女    时间: 2015-2-3 23:59
标题: PHP网页编程之PHP+MySQL使用中利用XOR运算加密算法
从刚开始练习的PHP基础语法练习,到PHP语言在WEB中的应用,再到实际的项目开发,如留言版,相册系统,中小型公司网站系统,以及期间做过的有关团队合作的小游戏,让我受益匪浅,学到了很多。     本文将引见一个复杂易用的加密/解密算法:利用异或(XOR)运算。本算法道理复杂,旨在使读者对信息的加密/解密有一个加倍直不雅的印象。

  XOR算法道理

  从加密的次要办法看,换位法过于复杂,出格是关于数据量少的情形很轻易由密文猜出明文,而交换法不掉为一种卓有成效的简略单纯算法。

  从各类交换法运算的特色看,异或运算最合适用于简略单纯加解密运算,这类办法的道理是:当一个数A和另外一个数B停止异或运算会生成另外一个数C,假如再将C和B停止异或运算则C又会复原为A。

  相对其他的简略单纯加密算法,XOR算法的长处以下。

  (1)算法复杂,关于初级言语很轻易能完成。

  (2)速度快,可以在任什么时候候、任何中央利用。

  (3)对任何字符都是无效的,不像有些简略单纯加密算法,只对西文字符无效,对中文加密后再解密没法复原为本来的字符。

  XOR算法完成

  上一局部引见了若何利用XOR运算停止加密/解密的道理,本节将利用其加密用户的登录信息。依据上一大节引见的XOR加密算法的道理,不难写出以下的加密解密函数。起首列出加密算法。

1 <!--encrypy_xor:复杂利用XOR运算的加密函数----------------------->
2 <?php
3 //加密函数
4 function myEncrypt($string, $key)
5 {
6 for($i=0; $i<STRLEN($STRING); p $i++)<>
7 {
8 for($j=0; $j<STRLEN($KEY); p $j++)<>
9 {
10 $string[$i] = $string[$i]^$key[$j];
11 }
12 }
13 return $string;
14 }
  第4行界说了加密函数myEncrypt(),输出参数$string为明文,而$key为密钥;输入为利用$key作为密钥并利用XOR加密算法发生的密文。

  第6~12行的外层for轮回对明文字符串的每个字符停止轮回,而内层的for轮回(第8~11行)对明文的每字符轮回与密钥的每位做异或运算。其道理已在上一大节中引见,不再重述。

  一样,与加密函数相似,可以写出上面的解密函数。

1 //解密函数
2 function myDecrypt($string, $key)
3 {
4 for($i=0; $i<STRLEN($STRING); p $i++)<>
5 {
6 for($j=0; $j<STRLEN($KEY); p $j++)<>
7 {
8 $string[$i] = $key[$j]^$string[$i];
9 }
10 }
11 return $string;
12 }
13 ?>
  第4行界说懂得密函数myDecrypt (),输出参数$string为密文,而$key为密钥;输入为利用$key作为密钥并利用XOR解密算法发生的明文。

  上面,经由过程一个使用示例来进一步申明加密函数的功效。

1 //示例
2 $my_password="chair";
3 echo "my_password = $my_password";
4 $my_key="1234567890";
5 $my_password_en=myEncrypt($my_password,$my_key);
6 echo "my_password_en = $my_password_en";
7 $my_password_de=myDecrypt($my_password_en,$my_key);
8 echo "my_password_de = $my_password_de";
  第3行起首界说了一个明文$my_password,然后在第4行界说密钥$my_key。

  第5、6行分离挪用加密函数生成密文并输入;反过去,又在第7、8即将密文解密。

  下面示例的运转了局以下。

  my_password = chair

  my_password_en = RYPXC

  my_password_de = chair

  用XOR算法完成身份验证

  上两局部分离引见了利用XOR运算停止信息加密/解密的道理和完成,上面,将利用这一办法来对用户的登录暗码停止加密。本例中,为了回护用户的暗码,体系想要到达的目标以下。

  ・在用户注册时,用户需求添写用户暗码表单。

  ・除用户自己以外,其他任何人都没法获得其暗码信息,包含体系设计者和数据库办理员。

  ・体系能依据用户输出的暗码验证用户的正当性。

  为了到达以上目标,利用XOR算法时可以选择用户名作为明文,而密钥是用户自界说的暗码,然后将加密后的用户名存储在数据库中。

  别的,在用户登录的时分,有以下两种体例来验证正当用户。

  (1)依据其提交的用户名(明文)和暗码(密钥)信息从头加密,并利用加密后的信息与数据库中存储的暗码信息停止对照,假如相等,则用户正当,不然,为不法用户。

  (2)依据数据库中存储的暗码信息(明文)和用户输出的暗码(密钥)信息停止解密,并把加密后的信息与用户提交的用户名停止对照,假如相等,则用户正当,不然,为不法用户。

  两种体例都可以完成第3个目标,本例,将采取第2种体例。本例的完成代码可在18.4.1节“用户登录”和18.4.2节“反省用户”的完成基本之上完成,个中“用户登录”页面无需变更,“反省用户”的完成参考以下。

1 <?php
2 session_start(); //装载Session库,必定要放在首行
3 $user_name=$_POST["user_name"];
4 session_register("user_name"); //注册$user_name变量,注重没有$符号
5
6 require_once("sys_conf.inc"); //体系设置装备摆设文件,包括数据库设置装备摆设信息
7 require_once("encrypy_xor.php"); //包括xor加密函数文件
8
9 //毗连数据库
10 $link_id=mysql_connect($DBHOST,$DBUSER,$DBPWD);
11 mysql_select_db($DBNAME); //选择数据库my_chat
12
13 //查询是不是存在登录用户信息
14 $str="select name,password from user where name ='$user_name'";
15 $result=mysql_query($str,$link_id); //履行查询
16 @$rows=mysql_num_rows($result); //获得查询了局的纪录笔数
17 $user_name=$_SESSION["user_name"];
18 $password=$_POST["password"];
19 $password_en=myEncrypt($user_name,$password); //加密用户信息
20
21 //关于老用户
22 if($rows!=0)
23 {
24 list($name,$pwd)=mysql_fetch_row($result);
25 $password_de=myDecrypt($pwd,$password); //解密用户信息
26
27 //假如暗码输出准确
28 if($user_name==$password_de)
29 {
30 $str="update user set is_online =1 where name ='$user_name' and password='$password_en'";
31 $result=mysql_query($str, $link_id); //履行查询
32 require("main.php"); //转到聊天页面
33 }
34 //暗码输出毛病
35 else
36 {
37 require("relogin.php");
38 }
39 }
40 //关于新用户,将其信息写入数据库
41 else
42 {
43 $str="insert into user (name,password,is_online) values('$user_name', '$password_en',1)";
44 $result=mysql_query($str, $link_id); //履行查询
45 require("main.php"); //转到聊天页面
46 }
47 //封闭数据库
48 mysql_close($link_id);
49 ?>
  第7行引入了加密函数文件encrypy_xor.php,包含上一大节引见的两个函数。

  第19行,利用用户提交的用户名和暗码失掉加密后的暗码值,而且关于新用户,在第44即将这个加密后的值存储在数据库中。

  别的,关于老用户,在第24获得数据库顶用户名和加密后的暗码信息,并在25行使用这两个值停止解密,然后在第28行经由过程对照解密后的值与用户提交的用户名信息来反省用户的正当性。
<P>  主动生成密钥

  上一局部引见了若何利用XOR加密算法停止对用户信息的加密,个中,用户所输出的口令信息实践上成了加密算法中的密钥,而用户名作为明文利用,固然这能很好地完胜利能,然而在逻辑上,这类办法仿佛有些不公道。

  本文将引见一种主动生成密钥的手艺,可使用主动生成的密钥对用户提交的暗码明文加密,使逻辑加倍公道一些。

  本例,假定生成的密钥为512位。代码以下。

1 <!--keygen.php:主动生成密钥------------------------------------>
2 <?php
3
4 //主动生生长度为$len的密钥
5 function generate_key($len)
6 {
7 $lowerbound = 35 ;
8 $upperbound = 96 ;
9 $strMyKey = "";
10
11 for($i=1;$i<=$len;$i++)
12 {
13 $rnd=rand(0,100); //发生随机数
14 $k = (($upperbound - $lowerbound) + 1) * $rnd + $lowerbound;
15 $strMyKey=$strMyKey.$k;
16 }
17 return $strMyKey;
18 }
19
20 //将密钥写入文件$file_name
21 function write_key($key,$file_name)
22 {
23 $filename="C:\key.txt";
24 $key=generate_key($key,512);
25
26 //利用添加形式翻开$filename,文件指针将会在文件的末尾
27 if(!$handle=fopen($filename,'w'))
28 {
29 print"不克不及翻开文件$filename";
30 exit;
31 }
32
33 //将$key写入到咱们翻开的文件中。
34 if(!fwrite($handle,$key))
35 {
36 print"不克不及写入到文件$filename";
37 exit;
38 }
39 fclose($handle);
40 }
41
42 //读取密钥文件中的密钥
43 function get_key($file_name)
44 {
45 //翻开文件
46 $fp = fopen ($file_name, "r");
47 $result="";
48 //逐行读取
49 while (!feof($fp))
50 {
51 $buffer = fgets($fp, 4096);
52 $result=$result.$buffer;
53 }
54 return $result;
55 }
56
57 ///*
58 $KeyLocation = "C:\key.txt"; //保留密钥的文件
59 $key="123456";
60 write_key($key,$KeyLocation);
61 echo get_key($KeyLocation);
62 //*/
63 ?>
  代码包含3个函数。

  ・generate_key($len):主动生生长度为$len的密钥

  ・write_key($key,$file_name):将密钥写入文件$file_name

  ・get_key($file_name):读取密钥文件$file_name中的密钥值

  在利用时,当用户第一次登录体系时,主动为其生成密钥值,关于这个密钥值,可以有两种体例来处置。

  (1)将其存入数据库的某个字段中,这类办法的弱点是密钥在数据库中的平安性没法失掉包管;

  (2)将这个密钥保留在用户当地的文件中,如许就能够防止密钥被他人获得,但这类体例的弱点是,当用户利用其他机械会见体系时,就没法登录。

  本例中,将利用第2种体例。

  详细地,下面代码第11~18行经由过程生成随机数的体例来不休生成密钥,并经由过程一个盘算来加强其庞杂性。个中的lowerbound和upperbound的数值其实就是你想利用来加密的ASCII字符局限。上面是生成的一个密钥文件示例。

  208123915925183361116049369344372701567721435181102718332639307390344373445407

  524316475863232913993383189547474747394154915312639841226741894189965623523913

  011164730113445201935692839710274127251577929493941487145611337531549110895367

  593586318332391170941272701152344371709270125776235313540032267139933835677407

  617384135696111239130732949469623520815987524358635491542913374933524334454251

  400327015367133759324537171709152357391089524342514685239122673135531363151191

  833412771743139654…

  最初,需求把密钥保留在办事器上一个平安的中央,然后就能够使用其和诸如XOR如许的加密算法来对用户信息停止加密/解密了。若何在上一局部引见的XOR中利用这个密钥十分复杂,不再胪陈。把例子全部敲进去试验,完成一遍以后就会有心得了,因为你会发现为啥我的程序和书上的一模一样就是结果不正确。新手学习的时候必须承认,不容易,因为我也是过来人,你会发现原来有那么多常用的语句,函数都要记。
作者: 灵魂腐蚀    时间: 2015-2-4 07:54
再就是混迹于论坛啦,咱们的phpchina的论坛就很强大,提出的问题一般都是有达人去解答的,以前的帖子也要多看看也能学到不少前辈们的经验。别的不错的论坛例如php100,javaeye也是很不错的。
作者: 再见西城    时间: 2015-2-9 19:18
再就是混迹于论坛啦,咱们的phpchina的论坛就很强大,提出的问题一般都是有达人去解答的,以前的帖子也要多看看也能学到不少前辈们的经验。别的不错的论坛例如php100,javaeye也是很不错的。
作者: 谁可相欹    时间: 2015-2-23 07:25
曾经犯过一个很低级的错误,我在文件命名的时候用了一个横线\\\\\\\'-\\\\\\\' 号,结果找了好几个小时的错误,事实是命名的时候 是不能用横线 \\\\\\\'-\\\\\\\' 的,应该用的是下划线  \\\\\\\'_\\\\\\\' ;
作者: 精灵巫婆    时间: 2015-3-7 05:52
曾经犯过一个很低级的错误,我在文件命名的时候用了一个横线\\\\\\\'-\\\\\\\' 号,结果找了好几个小时的错误,事实是命名的时候 是不能用横线 \\\\\\\'-\\\\\\\' 的,应该用的是下划线  \\\\\\\'_\\\\\\\' ;
作者: 若相依    时间: 2015-3-11 08:07
在学习的过程中不能怕麻烦,不能有懒惰的思想。学习php首先应该搭建一个lamp环境或者是wamp环境。这是学习php开发的根本。虽然网络上有很多集成的环境,安装很方便,使用起来也很稳定、
作者: 兰色精灵    时间: 2015-3-13 04:25
首先我是坚决反对新手上来就用框架的,因为对底层的东西一点都不了解,造成知识上的真空,会对以后的发展不利。我的观点上手了解下框架就好,代码还是手写。当然啦如果是位别的编程语言的高手的话,这个就另当别论啦。
作者: 小女巫    时间: 2015-3-20 12:42
当留言板完成的时候,下步可以把做1个单人的blog程序,做为目标,
作者: 愤怒的大鸟    时间: 2015-3-24 04:59
首先声明:我是一个菜鸟,是一个初学者。学习了一段php后总是感觉自己没有提高,无奈。经过反思我认为我学习过程中存在很多问题,我改变了学习方法后自我感觉有了明显的进步。
作者: 金色的骷髅    时间: 2015-4-4 19:38
最后祝愿,php会给你带来快乐的同时 你也会给他带来快乐。
作者: 分手快乐    时间: 2015-4-14 09:55
对于初学者来说不推荐去拿钱买的。当然如果一个网站你经常去用,而且里面的资料也比较有用,最好还是买个会员比较好,毕竟那些也是别人的工作成果。
作者: admin    时间: 2015-4-25 23:15
作为一个合格的coder 编码的规范是必须,命名方面我推崇“驼峰法”,另外就是自己写的代码最好要带注释,不然时间长了,就算是自己的代码估计看起来都费事,更不用说别人拉。
作者: 乐观    时间: 2015-4-28 15:50
再就是混迹于论坛啦,咱们的phpchina的论坛就很强大,提出的问题一般都是有达人去解答的,以前的帖子也要多看看也能学到不少前辈们的经验。别的不错的论坛例如php100,javaeye也是很不错的。
作者: 变相怪杰    时间: 2015-5-1 09:07
开发工具也会慢慢的更专业,每个公司的可能不一样,但是zend studio是个大伙都会用的。
作者: 海妖    时间: 2015-5-2 00:49
找到的的资料很多都是在论坛里的,需要注册,所以我一般没到一个论坛都注册一个id,所有的id都注册成一样的,这样下次再进来的时候就不用重复注册啦。当然有些论坛的某些资料是需要的付费的。
作者: 山那边是海    时间: 2015-5-9 11:20
,熟悉html,能用div+css,还有javascript,优先考虑linux。我在开始学习的时候,就想把这些知识一起学习,我天真的认为同时学习能够互相呼应,因为知识是相通的。
作者: 仓酷云    时间: 2015-5-9 14:35
先学习php和mysql,还有css(html语言很简单)我认为现在的效果比以前的方法好。
作者: 只想知道    时间: 2015-5-11 09:04
作为一个合格的coder 编码的规范是必须,命名方面我推崇“驼峰法”,另外就是自己写的代码最好要带注释,不然时间长了,就算是自己的代码估计看起来都费事,更不用说别人拉。
作者: 再现理想    时间: 2015-6-10 15:00
先学习php和mysql,还有css(html语言很简单)我认为现在的效果比以前的方法好。
作者: 冷月葬花魂    时间: 2015-6-13 20:55
其实也不算什么什么心得,在各位大侠算是小巫见大巫了吧,望大家不要见笑,若其中有错误的地方请各位大虾斧正。




欢迎光临 仓酷云 (http://ckuyun.com/) Powered by Discuz! X3.2