
日期:2006-09-28 作者:喜騰小二 來源:PHPChina
本文將介紹一個簡單易用的加密/解密演算法:使用異或(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 } |
| 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 ?> |
| 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"; |
| 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 ?> |