ホームページ > php教程 > php手册 > PHP+MySQL アプリケーションでの XOR 演算暗号化アルゴリズムの使用

PHP+MySQL アプリケーションでの XOR 演算暗号化アルゴリズムの使用

WBOY
リリース: 2016-06-21 09:07:09
オリジナル
969 人が閲覧しました

mysql|加密|算法|运算

【摘 要】 上一部分介绍了如何使用XOR运算进行加密/解密的原理,本节将使用其加密用户的登录信息。根据上一小节介绍的XOR加密算法的原理,不难写出以下的加密解密函数。首先列出加密算法。
本文将介绍一个简单易用的加密/解密算法:使用异或(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行通过比较解密后的值与用户提交的用户名信息来检查用户的合法性。

  自动生成密钥

  上一部分介绍了如何使用XOR加密算法进行对用户信息的加密,其中,用户所输入的口令信息实际上成为了加密算法中的密钥,而用户名作为明文使用,虽然这能很好地完成功能,但是在逻辑上,这种方法似乎有些不合理。

  本文将介绍一种自动生成密钥的技术,可以使用自动生成的密钥对用户提交的密码明文加密,使逻辑更加合理一些。

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

1 <!--keygen.php: 鍵を自動生成する------------------------------------ >
2 <?php
3
4 //長さのキーを自動生成 $len
5 functiongenerate_key($len)
6 {
7 $ lowerbound = 35;
8 $upperbound = 96;
9 $strMyKey = " ";
10
11 for($i=1;$i12 {
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): を読み取りますkey キー ファイル内のキー値 $file_name ユーザーが初めてシステムにログインするときに、キー値がユーザーに対して自動的に生成されます。このキー値を処理するには 2 つの方法があります。

(1) データベースの特定のフィールドに保存する この方法の欠点は、データベース内のキーのセキュリティが保証できないことです

(2) このキーをユーザーのローカル ファイルに保存すると、他の人がキーを取得するのを防ぎますが、この方法の欠点は、ユーザーが他のマシンを使用してシステムにアクセスすると、ログインできないことです。

この例では、2番目の方法が使用されます。

具体的には、上記のコードの 11 行目から 18 行目は、乱数を生成することでキーを継続的に生成し、計算によってその複雑さを高めます。下限値と上限値は、実際には暗号化に使用する ASCII 文字の範囲です。以下は、生成されたキー ファイルの例です。

208123915925183361116049369344372701567721435181102718332639307390344373445407

52431647586323291399338 89547474747394154915312639841226741894189965623523913

01116473011344520193569283971027412725157792949394148714 00327015367133759324537171709152357 391089524342514685239122673135531363151191

833412771743139654…

最後に、キーを保存する必要がありますサーバー上の安全な場所に保存し、XOR アルゴリズムなどの暗号化を使用して暗号化/ユーザー情報を復号化します。前のセクションで紹介した XOR でこのキーを使用する方法は非常に簡単なので、詳細は説明しません。


関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のおすすめ
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート