Cet article présentera un algorithme de chiffrement/déchiffrement simple et facile à utiliser : utilisant l'opération OU exclusif (XOR). Le principe de cet algorithme est simple et vise à donner aux lecteurs une impression plus intuitive du cryptage/déchiffrement des informations.
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 efficace et simple algorithme.
À en juger par 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, un autre nombre C sera généré If Then. une opération XOR sur C et B, et C sera restitué à 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) Il est valable pour n'importe quel caractère. Contrairement à certains algorithmes de cryptage simples, qui ne sont valables que pour les caractères occidentaux, les caractères chinois ne peuvent pas être restaurés aux caractères d'origine après cryptage et déchiffrement.
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.
1 <!--encrypy_xor : Une fonction de chiffrement qui utilise simplement l'opération XOR----------------------->
2<?php
3 //Fonction de cryptage
4 fonctions myEncrypt ($string, $key)
5 {
6 pour($i=0; $i<STRLEN($STRING); p $i++)<>
7 {
8 pour($j=0; $j<STRLEN($KEY); p $j++)<>
9 {
10 $string[$i] = $string[$i]^$key[$j];
11 }
12}
13 renvoie $string;
14}
La ligne 4 définit la fonction de chiffrement myEncrypt(). Le paramètre d'entrée $string est du texte en clair et $key est la clé ; la sortie est le texte chiffré généré en utilisant $key comme clé et en utilisant l'algorithme de chiffrement XOR.
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 effectue une exception sur chaque bit de l'opération OU. Le principe a été introduit dans la section précédente et ne sera pas réitéré.
Encore une fois, similaire à la fonction de chiffrement, la fonction de décryptage suivante peut être écrite.
1 //fonction de décryptage
2 fonctions myDecrypt ($string, $key)
3 {
4 pour($i=0; $i<STRLEN($STRING); p $i++)<>
5 {
6 pour($j=0; $j<STRLEN($KEY); p $j++)<>
7 {
8 $string[$i] = $key[$j]^$string[$i];
9}
10}
11 renvoie $string;
12}
13?>
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 le texte brut généré en utilisant $key comme clé et en utilisant l'algorithme de décryptage XOR.
Ci-dessous, un exemple d'application est utilisé pour illustrer davantage le fonctionnement de la fonction de cryptage.
1 //Exemple
2 $my_password="chaise";
3 echo "mon_mot de passe = $mon_mot de passe";
4 $ma_clé="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" ;
la ligne 3 définit d'abord un texte clair $my_password, puis définit la clé $my_key à la ligne 4.
Les lignes 5 et 6 appellent respectivement la fonction de chiffrement 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’exécution de l’exemple ci-dessus sont les suivants.
my_password = chair
my_password_en = RYPXC
my_password_de = chair
Implémentation de l'authentification d'identité à l'aide de l'algorithme XOR
Les deux parties précédentes ont présenté le principe et la mise en œuvre du cryptage/déchiffrement des informations à l'aide de l'opération XOR. Ensuite, 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 un 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égal, sinon. , l'utilisateur est illégal.
(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, pour les utilisateurs illégaux.
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.
1 <?php
2 session_start(); //Charge la bibliothèque Session, qui doit être placée sur la première ligne
3 $nom_utilisateur=$_POST["nom_utilisateur"];
4 session_register("user_name"); //Enregistre la variable $user_name, notez qu'il n'y a pas de symbole $
5
6 require_once("sys_conf.inc"); //Fichier de configuration du système, comprenant les informations de configuration de la base de données
7 require_once("encrypy_xor.php"); //Contient le fichier de fonction de chiffrement xor
8
9 //Se connecter à la base de données
10 $link_id=mysql_connect($DBHOST,$DBUSER,$DBPWD);
11 mysql_select_db($DBNAME); //Sélectionner la base de données my_chat
12
13 //Demande si des informations utilisateur sont connectées
14 $str="sélectionner le nom, le mot de passe de l'utilisateur où nom ='$user_name'";
15 $result=mysql_query($str,$link_id); //Exécuter la requête
16 @$rows=mysql_num_rows($result); //Le nombre d'enregistrements obtenus à partir des résultats de la requête
17 $nom_utilisateur=$_SESSION["nom_utilisateur"];
18 $mot de passe=$_POST["mot de passe"];
19 $password_en=myEncrypt($user_name,$password); //Crypter les informations utilisateur
20
21 //Pour les anciens utilisateurs
22 si($lignes!=0)
vingt-trois {
24 list($name,$pwd)=mysql_fetch_row($result);
25 $password_de=myDecrypt($pwd,$password); //Déchiffrer les informations utilisateur
26
27 //Si le mot de passe est correctement saisi
28 si($user_name==$password_de)
29 {
30 $str="mettre à jour l'ensemble d'utilisateurs is_online =1 où nom ='$user_name' et password='$password_en'";
31 $result=mysql_query($str, $link_id); //Exécuter la requête
32 require("main.php"); //Aller à la page de discussion
33}
34 //Erreur de saisie du mot de passe
35 autres
36 {
37 require("relogin.php");
38 }
39 }
40 //Pour les nouveaux utilisateurs, écrivez leurs informations dans la base de données
41 autres
42 {
43 $str="insérer dans les valeurs de l'utilisateur (nom, mot de passe, est_en ligne)('$user_name', '$password_en',1)";
44 $result=mysql_query($str, $link_id); //Exécuter la requête
45 require("main.php"); //Aller à la page de discussion
46 }
47 //Fermer la base de données
48 mysql_close($link_id);
49 ?>
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, la valeur cryptée du mot de passe est obtenue à l'aide du nom d'utilisateur et du mot de passe soumis par l'utilisateur, et pour les nouveaux utilisateurs, cette 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, utilisez ces deux valeurs pour décrypter à la ligne 25, puis comparez la valeur déchiffrée avec les informations de nom d'utilisateur soumises par le utilisateur à la ligne 28 pour vérifier la légitimité de l'utilisateur.
La partie précédente dela génération automatique de clés
a présenté comment utiliser l'algorithme de cryptage XOR pour crypter les informations 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. très Elle remplit bien la fonction, mais logiquement, cette méthode semble un peu déraisonnable.
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 du mot de passe soumis par l'utilisateur, 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.
1 <!--keygen.php : Générer automatiquement les clés-------------------------------------------------->
2<?php
3
4 //Générer automatiquement une clé de longueur $len
5 fonctions generate_key($len)
6 {
7 $limite inférieure = 35 ;
8 $ limite supérieure = 96 ;
9 $strMaClé = "";
10
11 pour ($i=1;$i<=$len;$i++)
12 {
13 $rnd=rand(0,100); //Générer des nombres aléatoires
14 $k = ($upperbound - $lowerbound) + 1) * $rnd + $lowerbound ;
15 $strMyKey=$strMyKey.$k;
16}
17 renvoie $strMyKey ;
18}
19
20 //Ecrit la clé du fichier $file_name
21 fonction write_key($key,$file_name)
vingt-deux {
23 $filename="C:key.txt";
24 $key=generate_key($key,512);
25
26 //Ouvrez $filename en utilisant le mode add, le pointeur de fichier sera à la fin du fichier
27 si(!$handle=fopen($filename,'w'))
28 {
29 print "Impossible d'ouvrir le fichier $filename" ;
30 sortie;
31}
32
33 //Écrivez $key dans le fichier que nous avons ouvert.
34 si(!fwrite($handle,$key))
35 {
36 print "Impossible d'écrire dans le fichier $filename" ;
Sortie 37 ;
38 }
39 fclose($poignée);
40}
41
42 //Lire la clé dans le fichier clé
43 fonction get_key ($ file_name)
44 {
45 //Ouvrir le fichier
46 $fp = fopen ($nom_fichier, "r");
47 $result="";
48 //Lire ligne par ligne
49 tandis que (!feof($fp))
50 {
51 $buffer = fgets($fp, 4096);
52 $result=$result.$buffer;
53}
54 renvoie $result ;
55 }
56
57 ///*
58 $KeyLocation = "C:key.txt"; //Fichier pour enregistrer la clé
59 $clé="123456";
60 write_key($clé,$KeyLocation);
61 echo get_key($KeyLocation);
62 //*/
63 ?>
Le code comprend 3 fonctions.
·generate_key($len) : génère automatiquement une clé de longueur $len
·write_key($key,$file_name) : écrit la clé dans le fichier $file_name
·get_key($file_name) : lit le fichier clé $file_name Lorsque la valeur de la clé
est utilisé, lorsque l'utilisateur se connecte au système pour la première fois, la valeur clé est automatiquement générée pour l'utilisateur. Il existe deux façons de gérer cette valeur clé.
(1) Stockez-la dans un certain champ de la base de données. L'inconvénient de cette méthode est que la sécurité de la clé dans la base de données ne peut pas être garantie ;
(2) Enregistrez la clé dans le fichier local de l'utilisateur, afin que cela empêche la clé ; d'être obtenu par d'autres, mais l'inconvénient de cette méthode est que lorsque les utilisateurs utilisent d'autres machines pour accéder au système, ils ne peuvent pas se connecter.
Dans cet exemple, la méthode 2 sera utilisée.
Plus précisément, les lignes 11 à 18 du code ci-dessus génèrent en continu des clés en générant des nombres aléatoires et améliorent leur complexité grâce à un calcul. Les valeurs inférieures et supérieures sont en fait la plage de caractères ASCII que vous souhaitez utiliser pour le chiffrement. Vous trouverez ci-dessous un exemple de fichier de clé généré.
208123915925183361116049369344372701567721435181102718332639307390344373445407
524316475863232913993383189547474747394154915312639841226741894189965623523913
011164730113445201935692839710274127251577929493941487145611337531549110895367
593586318332391170941272701152344371709270125776235313540032267139933835677407
617384135696111239130732949469623520815987524358635491542913374933524334454251
400327015367133759324537171709152357391089524342514685239122673135531363151191
833412771743139654…
最后,需要把密钥保存在服务器上一个安全的地方,然后就可以利用其和诸如XOR这样的加密算法来对用户信息进行加密/解密了。 Comment utiliser cette clé dans le XOR introduit dans la section précédente est très simple et ne sera pas décrit en détail. 2 pages au total. 9 7 1 2