Maison >développement back-end >tutoriel php >Partage de l'algorithme de chiffrement à l'aide de l'opération XOR dans l'application PHP MySQL

Partage de l'algorithme de chiffrement à l'aide de l'opération XOR dans l'application PHP MySQL

高洛峰
高洛峰original
2017-01-07 16:36:081581parcourir

Principe de l'algorithme XOR

Du point de vue de la méthode principale de cryptage, la méthode de transposition est trop simple, surtout lorsque la quantité de données est petite, il est facile de deviner le texte en clair à partir du texte chiffré, et la méthode de substitution est un bon choix. Algorithme simple et efficace.

D'après les caractéristiques des diverses opérations de substitution, l'opération XOR est la plus adaptée aux opérations simples de cryptage et de déchiffrement. Le principe de cette méthode est le suivant : lorsqu'un nombre A et un autre nombre B sont XOR, elle générera un autre. numéro C, si C et B sont XORed, C sera restauré en A.

Par rapport à d'autres algorithmes de chiffrement simples, les avantages de l'algorithme XOR sont les suivants.

(1) L'algorithme est simple et peut être facilement implémenté dans des langages de haut niveau.

(2) Il est rapide et peut être utilisé à tout moment et n'importe où.

(3) est valable pour n'importe quel caractère, contrairement à certains algorithmes de cryptage simples, qui ne sont valables que pour les caractères occidentaux. Après avoir crypté les caractères chinois puis les avoir déchiffrés, ils ne peuvent pas être restaurés aux caractères d'origine.

Implémentation de l'algorithme XOR

La partie précédente a présenté le principe d'utilisation de l'opération XOR pour le cryptage/déchiffrement. Cette section l'utilisera pour crypter les informations de connexion de l'utilisateur. Selon le principe de l'algorithme de chiffrement XOR présenté dans la section précédente, il n'est pas difficile d'écrire les fonctions de chiffrement et de déchiffrement suivantes. Les algorithmes de chiffrement sont répertoriés en premier.

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

La ligne 4 définit la fonction de cryptage myEncrypt(). Le paramètre d'entrée $string est du texte brut et $key est la clé ; la sortie est le mot de passe généré en utilisant $key comme clé et le XOR ; algorithme de cryptage arts.
La boucle for externe des lignes 6 à 12 parcourt chaque caractère de la chaîne de texte en clair, tandis que la boucle for interne (lignes 8 à 11) parcourt chaque caractère du texte en clair et chaque caractère de l'opération Bit XOR. Le principe a été introduit dans la section précédente et ne sera pas réitéré.
De même, similaire à la fonction de cryptage, la fonction de décryptage suivante peut être écrite.

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

La ligne 4 définit la fonction de décryptage myDecrypt(), le paramètre d'entrée $string est le texte chiffré et $key est la clé ; la sortie est générée en utilisant $key comme clé et en utilisant le déchiffrement XOR ; algorithme en texte brut.
Ci-dessous, un exemple d'application est utilisé pour illustrer davantage le fonctionnement de la fonction de cryptage.

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

La ligne 3 définit d'abord un texte en clair $my_password, puis définit la clé $my_key à la ligne 4.
Les lignes 5 et 6 appellent la fonction de cryptage pour générer le texte chiffré et le sortir à son tour, le texte chiffré est déchiffré sur les lignes 7 et 8.
Les résultats de l'exemple ci-dessus sont les suivants.
my_password=chair
my_password_en=RYPXC
my_password_de=chair
Utiliser l'algorithme XOR pour implémenter l'authentification
Les deux parties précédentes présentent le principe et la mise en œuvre du cryptage/déchiffrement des informations à l'aide de l'opération XOR Ce qui suit. is , cette méthode sera utilisée pour crypter le mot de passe de connexion de l'utilisateur. Dans cet exemple, afin de protéger le mot de passe de l'utilisateur, le système souhaite atteindre les objectifs suivants.
·Lors de son inscription, l'utilisateur doit remplir le formulaire de mot de passe utilisateur.
·En plus de l'utilisateur lui-même, personne d'autre ne peut obtenir ses informations de mot de passe, y compris les concepteurs de systèmes et les administrateurs de bases de données.
·Le système peut vérifier la légitimité de l'utilisateur en fonction du mot de passe saisi par l'utilisateur.
Afin d'atteindre l'objectif ci-dessus, lorsque vous utilisez l'algorithme XOR, vous pouvez choisir le nom d'utilisateur sous forme de texte brut, et la clé est le mot de passe défini par l'utilisateur, puis stocker le nom d'utilisateur crypté dans la base de données.
De plus, lorsqu'un utilisateur se connecte, il existe les deux manières suivantes de vérifier les utilisateurs légitimes.
(1) Chiffrez à nouveau en fonction des informations de nom d'utilisateur (texte brut) et de mot de passe (clé) soumises, et utilisez les informations cryptées pour comparer avec les informations de mot de passe stockées dans la base de données. Si elles sont égales, l'utilisateur est légitime. , sinon, Pour les utilisateurs illégaux.
(2) Décryptez en fonction des informations de mot de passe (texte brut) stockées dans la base de données et des informations de mot de passe (clé) saisies par l'utilisateur, et comparez les informations cryptées avec le nom d'utilisateur soumis par l'utilisateur s'ils sont égaux. , l'utilisateur est légitime, sinon c'est un utilisateur illégal.
Les deux méthodes peuvent atteindre le troisième objectif. Dans cet exemple, la deuxième méthode sera utilisée. Le code d'implémentation de cet exemple peut être implémenté sur la base de l'implémentation de la section 18.4.1 « Connexion utilisateur » et de la section 18.4.2 « Vérifier l'utilisateur ». La page « Connexion utilisateur » n'a pas besoin d'être modifiée. La référence d'implémentation de « . Vérifier l'utilisateur" est la suivante.

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

La ligne 7 introduit le fichier de fonctions de chiffrement encrypy_xor.php, incluant les deux fonctions introduites dans la section précédente.
À la ligne 19, le nom d'utilisateur et le mot de passe soumis par l'utilisateur sont utilisés pour obtenir la valeur du mot de passe crypté, et pour les nouveaux utilisateurs, la valeur cryptée est stockée dans la base de données à la ligne 44.
De plus, pour les anciens utilisateurs, obtenez les informations de nom d'utilisateur et de mot de passe crypté dans la base de données à la ligne 24, et utilisez ces deux valeurs pour décrypter à la ligne 25, puis comparez la valeur déchiffrée avec celle soumise par l'utilisateur à la ligne 28 Informations sur le nom d'utilisateur pour vérifier la légitimité de l'utilisateur.
Générer automatiquement les clés
La partie précédente a présenté comment utiliser l'algorithme de cryptage XOR pour crypter les informations de l'utilisateur. Les informations de mot de passe saisies par l'utilisateur deviennent en fait la clé dans l'algorithme de cryptage et le nom d'utilisateur est utilisé sous forme de texte brut. Même si cela fait bien son travail, cette approche semble logiquement un peu peu judicieuse.
Cet article présentera une technologie qui génère automatiquement des clés. Vous pouvez utiliser les clés générées automatiquement pour crypter le texte brut des mots de passe soumis par les utilisateurs, rendant la logique plus raisonnable.
Dans cet exemple, on suppose que la clé générée est de 512 bits. Le code est le suivant.

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


Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn