Heim  >  Artikel  >  Backend-Entwicklung  >  Gemeinsame Nutzung des Verschlüsselungsalgorithmus mithilfe der XOR-Operation in der PHP-MySQL-Anwendung

Gemeinsame Nutzung des Verschlüsselungsalgorithmus mithilfe der XOR-Operation in der PHP-MySQL-Anwendung

高洛峰
高洛峰Original
2017-01-07 16:36:081536Durchsuche

Prinzip des XOR-Algorithmus

Aus Sicht der Hauptverschlüsselungsmethode ist die Transpositionsmethode zu einfach. Insbesondere wenn die Datenmenge gering ist, ist es leicht, den Klartext aus dem Chiffretext zu erraten. und die Substitutionsmethode ist eine gute Wahl.

Aufgrund der Eigenschaften verschiedener Substitutionsoperationen eignet sich die XOR-Operation am besten für einfache Verschlüsselungs- und Entschlüsselungsoperationen. Das Prinzip dieser Methode lautet: Wenn eine Zahl A und eine andere Zahl B XOR-verknüpft werden, wird eine andere generiert Nummer C, wenn C und B XOR-verknüpft werden, wird C zu A wiederhergestellt.

Im Vergleich zu anderen einfachen Verschlüsselungsalgorithmen bietet der XOR-Algorithmus folgende Vorteile.

(1) Der Algorithmus ist einfach und kann leicht in Hochsprachen implementiert werden.

(2) Es ist schnell und kann jederzeit und überall verwendet werden.

(3) gilt für jedes Zeichen. Im Gegensatz zu einigen einfachen Verschlüsselungsalgorithmen, die nur für westliche Zeichen gültig sind, können chinesische Zeichen nach der Ver- und Entschlüsselung nicht auf die ursprünglichen Zeichen zurückgesetzt werden.

Implementierung des XOR-Algorithmus

Im vorherigen Teil wurde das Prinzip der Verwendung der XOR-Operation zur Verschlüsselung/Entschlüsselung vorgestellt. In diesem Abschnitt wird sie zum Verschlüsseln der Anmeldeinformationen des Benutzers verwendet. Gemäß dem im vorherigen Abschnitt vorgestellten Prinzip des XOR-Verschlüsselungsalgorithmus ist es nicht schwierig, die folgenden Verschlüsselungs- und Entschlüsselungsfunktionen zu schreiben. Verschlüsselungsalgorithmen werden zuerst aufgeführt.

<!–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; 
}

Zeile 4 definiert die Verschlüsselungsfunktion myEncrypt(). Der Eingabeparameter $string ist Klartext und die Ausgabe ist das mit $key als Schlüssel und XOR generierte Passwort Verschlüsselungsalgorithmus.
Die äußere for-Schleife in den Zeilen 6 bis 12 durchläuft jedes Zeichen der Klartextzeichenfolge, während die innere for-Schleife (Zeilen 8 bis 11) jedes Zeichen im Klartext und jedes Zeichen in der Schlüsselbit-XOR-Operation durchläuft. Der Grundsatz wurde im vorherigen Abschnitt eingeführt und wird nicht wiederholt.
Ähnlich wie bei der Verschlüsselungsfunktion kann die folgende Entschlüsselungsfunktion geschrieben werden.

//解密函数 
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; 
} 
?>

Zeile 4 definiert die Entschlüsselungsfunktion myDecrypt(), der Eingabeparameter $string ist der Chiffretext und $key ist der Schlüssel; die Ausgabe wird mit $key als Schlüssel und unter Verwendung der XOR-Entschlüsselung generiert Algorithmus Klartext.
Nachfolgend wird anhand eines Anwendungsbeispiels die Funktion der Verschlüsselungsfunktion näher erläutert.

//示例 
$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";

Zeile 3 definiert zunächst einen Klartext $my_password und definiert dann den Schlüssel $my_key in Zeile 4.
Die Zeilen 5 und 6 rufen die Verschlüsselungsfunktion auf, um Chiffretext zu generieren und auszugeben. Der Chiffretext wird wiederum in den Zeilen 7 und 8 entschlüsselt.
Die Ergebnisse des obigen Beispiels sind wie folgt.
my_password=chair
my_password_en=RYPXC
my_password_de=chair
Verwendung des XOR-Algorithmus zur Implementierung der Authentifizierung
Die beiden vorherigen Teile stellen das Prinzip und die Implementierung der Informationsverschlüsselung/-entschlüsselung mithilfe der XOR-Operation vor ist, wird diese Methode verwendet, um das Anmeldekennwort des Benutzers zu verschlüsseln. In diesem Beispiel möchte das System zum Schutz des Benutzerkennworts die folgenden Ziele erreichen.
·Bei der Registrierung muss der Benutzer das Benutzerpasswortformular ausfüllen.
·Außer dem Benutzer selbst kann niemand sonst an seine Passwortinformationen gelangen, auch nicht Systemdesigner und Datenbankadministratoren.
·Das System kann die Legitimität des Benutzers anhand des vom Benutzer eingegebenen Passworts überprüfen.
Um den oben genannten Zweck zu erreichen, können Sie bei Verwendung des XOR-Algorithmus den Benutzernamen als Klartext und den Schlüssel als benutzerdefiniertes Passwort auswählen und dann den verschlüsselten Benutzernamen in der Datenbank speichern.
Darüber hinaus gibt es beim Anmelden von Benutzern die folgenden zwei Möglichkeiten, legitime Benutzer zu überprüfen.
(1) Verschlüsseln Sie basierend auf den übermittelten Informationen zu Benutzername (Klartext) und Passwort (Schlüssel) erneut und vergleichen Sie die verschlüsselten Informationen mit den in der Datenbank gespeicherten Passwortinformationen. Wenn sie gleich sind, ist der Benutzer legitim , andernfalls für illegale Benutzer.
(2) Entschlüsseln Sie basierend auf den in der Datenbank gespeicherten Passwortinformationen (Klartext) und den vom Benutzer eingegebenen Passwortinformationen (Schlüssel) und vergleichen Sie die verschlüsselten Informationen mit dem vom Benutzer übermittelten Benutzernamen, wenn sie gleich sind , ist der Benutzer legitim, andernfalls handelt es sich um einen illegalen Benutzer.
Beide Methoden können den dritten Zweck erreichen. In diesem Beispiel wird die zweite Methode verwendet. Der Implementierungscode dieses Beispiels kann basierend auf der Implementierung von Abschnitt 18.4.1 „Benutzeranmeldung“ und Abschnitt 18.4.2 „Benutzeranmeldung“ implementiert werden. Die Implementierungsreferenz von „. „Benutzer prüfen“ lautet wie folgt.

<?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); 
?>

Zeile 7 stellt die Verschlüsselungsfunktionsdatei encrypy_xor.php vor, einschließlich der beiden im vorherigen Abschnitt eingeführten Funktionen.
In Zeile 19 werden der vom Benutzer übermittelte Benutzername und das Passwort verwendet, um den verschlüsselten Passwortwert zu erhalten, und für neue Benutzer wird der verschlüsselte Wert in Zeile 44 in der Datenbank gespeichert.
Besorgen Sie sich für alte Benutzer außerdem den Benutzernamen und die verschlüsselten Passwortinformationen in der Datenbank in Zeile 24, verwenden Sie diese beiden Werte zum Entschlüsseln in Zeile 25 und vergleichen Sie dann den entschlüsselten Wert mit dem übermittelten Wert vom Nutzer in Zeile 28 Angaben zum Benutzernamen, um die Legitimität des Nutzers zu überprüfen.
Schlüssel automatisch generieren
Im vorherigen Teil wurde erläutert, wie der XOR-Verschlüsselungsalgorithmus zum Verschlüsseln von Benutzerinformationen verwendet wird. Die vom Benutzer eingegebenen Kennwortinformationen werden tatsächlich zum Schlüssel im Verschlüsselungsalgorithmus und der Benutzername wird als Klartext verwendet Obwohl dies gut funktioniert, scheint dieser Ansatz logischerweise etwas unzutreffend.
In diesem Artikel wird eine Technologie vorgestellt, die automatisch Schlüssel generiert. Sie können die automatisch generierten Schlüssel verwenden, um den Klartext des vom Benutzer übermittelten Passworts zu verschlüsseln, wodurch die Logik sinnvoller wird.
In diesem Beispiel wird davon ausgegangen, dass der generierte Schlüssel 512 Bit lang ist. Der Code lautet wie folgt.

<!–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中文网!


Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn