首頁 後端開發 php教程 PHP MySQL應用程式中使用XOR運算加密演算法分享

PHP MySQL應用程式中使用XOR運算加密演算法分享

Jan 07, 2017 pm 04:36 PM

XOR演算法原理

從加密的主要方法來看,換位法過於簡單,特別是對於資料量少的情況很容易由密文猜出明文,而替換法不失為一種行之有效的簡易演算法。

從各種替換法運算的特點看,異或運算最適合用於簡易加解密運算,這種方法的原理是:當一個數A和另一個數B進行異或運算會產生另一個數C ,如果再將C和B進行異或運算則C又會還原為A。

相對於其他的簡易加密演算法,XOR演算法的優點如下。

(1)演算法簡單,對於高階語言很容易實現。

(2)速度快,可以在任何時間、任何地方使用。

(3)對任何字元都是有效的,不像有些簡易加密演算法,只對西文字元有效,對中文加密後再解密無法還原為原來的字元。

XOR演算法實作

上一部分介紹如何使用XOR運算進行加密/解密的原理,本節將使用其加密使用者的登入資訊。根據上一小節介紹的XOR加密演算法的原理,不難寫出以下的加密解密函數。首先列出加密演算法。

<!–encrypy_xor:简单使用XOR运算的加密函数———————–> 
<?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; 
}
登入後複製

第4行定義了加密函數myEncrypt(),輸入參數$string為明文,而$key為密鑰;輸出為使用$key作為密鑰並使用XOR加密演算法產生的密文。
第6~12行的外層for循環對明文字串的每一個字進行循環,而內層的for循環(第8~11行)對明文的每一字符循環與密鑰的每一位做異或運算。其原理已在上一小節介紹,不再重述。 
同樣,與加密函數類似,可以寫出下面的解密函數。 

//解密函数 
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; 
} 
?>
登入後複製

第4行定義了解密函數myDecrypt(),輸入參數$string為密文,而$key為金鑰;輸出為使用$key作為金鑰並使用XOR解密演算法產生的明文。 
下面,透過一個應用範例來進一步說明加密函數的功能。 

//示例 
$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";
登入後複製

第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節「檢查使用者"的實作基礎之上實現,其中「使用者登入"頁面無需變化,「檢查使用者"的實現參考如下。 

<?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=&#39;$user_name&#39;"; 
$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=&#39;$user_name&#39;andpassword=&#39;$password_en&#39;"; 
$result=mysql_query($str,$link_id);//执行查询 
require(“main.php");//转到聊天页面 
} 
//密码输入错误 
else 
{ 
require(“relogin.php"); 
} 
} 
//对于新用户,将其信息写入数据库 
else 
{ 
$str="insertintouser(name,password,is_online)values(‘$user_name&#39;,&#39;$password_en&#39;,1)"; 
$result=mysql_query($str,$link_id);//执行查询 
require(“main.php");//转到聊天页面 
} 
//关闭数据库 
mysql_close($link_id); 
?>
登入後複製

第7行引入了加密函數檔案encrypy_xor.php,包括上一小節介紹的兩個函數。 
第19行,使用用戶提交的用戶名和密碼得到加密後的密碼值,並且對於新用戶,在第44行將這個加密後的值儲存在資料庫中。
另外,對於老用戶,在第24獲取資料庫中用戶名和加密後的密碼信息,並在25行利用這兩個值進行解密,然後在第28行通過比較解密後的值與用戶提交的用戶名資訊來檢查使用者的合法性。
自動產生金鑰 
上一部分介紹如何使用XOR加密演算法進行對使用者資訊的加密,其中,使用者所輸入的口令資訊實際上成為了加密演算法中的金鑰,而使用者名稱作為明文使用,雖然這能很好地完成功能,但是在邏輯上,這種方法似乎有些不合理。 
本文將介紹一種自動產生密鑰的技術,可以使用自動產生的密鑰對使用者提交的密碼明文加密,使邏輯更加合理一些。 
本例,假設產生的密鑰為512位元。代碼如下。 

<!–keygen.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,&#39;w&#39;)) 
{ 
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); 
//*/ 
?>
登入後複製

代码包括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中使用这个密钥非常简单,不再详述。


更多PHP MySQL应用中使用XOR运算加密算法分享相关文章请关注PHP中文网!


本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

在PHP API中說明JSON Web令牌(JWT)及其用例。 在PHP API中說明JSON Web令牌(JWT)及其用例。 Apr 05, 2025 am 12:04 AM

JWT是一種基於JSON的開放標準,用於在各方之間安全地傳輸信息,主要用於身份驗證和信息交換。 1.JWT由Header、Payload和Signature三部分組成。 2.JWT的工作原理包括生成JWT、驗證JWT和解析Payload三個步驟。 3.在PHP中使用JWT進行身份驗證時,可以生成和驗證JWT,並在高級用法中包含用戶角色和權限信息。 4.常見錯誤包括簽名驗證失敗、令牌過期和Payload過大,調試技巧包括使用調試工具和日誌記錄。 5.性能優化和最佳實踐包括使用合適的簽名算法、合理設置有效期、

會話如何劫持工作,如何在PHP中減輕它? 會話如何劫持工作,如何在PHP中減輕它? Apr 06, 2025 am 12:02 AM

會話劫持可以通過以下步驟實現:1.獲取會話ID,2.使用會話ID,3.保持會話活躍。在PHP中防範會話劫持的方法包括:1.使用session_regenerate_id()函數重新生成會話ID,2.通過數據庫存儲會話數據,3.確保所有會話數據通過HTTPS傳輸。

描述紮實的原則及其如何應用於PHP的開發。 描述紮實的原則及其如何應用於PHP的開發。 Apr 03, 2025 am 12:04 AM

SOLID原則在PHP開發中的應用包括:1.單一職責原則(SRP):每個類只負責一個功能。 2.開閉原則(OCP):通過擴展而非修改實現變化。 3.里氏替換原則(LSP):子類可替換基類而不影響程序正確性。 4.接口隔離原則(ISP):使用細粒度接口避免依賴不使用的方法。 5.依賴倒置原則(DIP):高低層次模塊都依賴於抽象,通過依賴注入實現。

PHP 8.1中的枚舉(枚舉)是什麼? PHP 8.1中的枚舉(枚舉)是什麼? Apr 03, 2025 am 12:05 AM

PHP8.1中的枚舉功能通過定義命名常量增強了代碼的清晰度和類型安全性。 1)枚舉可以是整數、字符串或對象,提高了代碼可讀性和類型安全性。 2)枚舉基於類,支持面向對象特性,如遍歷和反射。 3)枚舉可用於比較和賦值,確保類型安全。 4)枚舉支持添加方法,實現複雜邏輯。 5)嚴格類型檢查和錯誤處理可避免常見錯誤。 6)枚舉減少魔法值,提升可維護性,但需注意性能優化。

在PHPStorm中如何進行CLI模式的調試? 在PHPStorm中如何進行CLI模式的調試? Apr 01, 2025 pm 02:57 PM

在PHPStorm中如何進行CLI模式的調試?在使用PHPStorm進行開發時,有時我們需要在命令行界面(CLI)模式下調試PHP�...

如何在系統重啟後自動設置unixsocket的權限? 如何在系統重啟後自動設置unixsocket的權限? Mar 31, 2025 pm 11:54 PM

如何在系統重啟後自動設置unixsocket的權限每次系統重啟後,我們都需要執行以下命令來修改unixsocket的權限:sudo...

如何用PHP的cURL庫發送包含JSON數據的POST請求? 如何用PHP的cURL庫發送包含JSON數據的POST請求? Apr 01, 2025 pm 03:12 PM

使用PHP的cURL庫發送JSON數據在PHP開發中,經常需要與外部API進行交互,其中一種常見的方式是使用cURL庫發送POST�...

See all articles