Méthode de cryptage par table de correspondance personnalisée

Image non disponible

Voici une méthode de cryptage par "table de correspondance personnalisée" en PHP.

Article lu   fois.

L'auteur

Profil ProSite personnel

Liens sociaux

Viadeo Twitter Facebook Share on Google+   

I. Principe

I-A. Avant-propos

Au lieu d'envoyer vos messages "en clair", il est parfois utile de les coder. Il suffira ensuite de les décoder au moment de les utiliser.
Ex. : crypter le contenu de ses e-mails ou de ses messages sur Facebook ! (le destinataire doit avoir le script de décodage).

Cette méthode "maison" n'offre qu'une protection de niveau 0,1 sur une échelle de 10 !
C'est un algorythme efficace contre les "petits curieux", mais en aucun cas contre les "pro du piratage", du fait de sa (relative) simplicité (voir la section "Faiblesses").
Pour une sécurité renforcée, des algorythmes bien plus puissants existent (et ont fait leurs preuves).

I-B. Méthode de cryptage par "table de correspondance personnalisée"

Principe :
  • La création de 2 tableaux array() mettant en correspondance les éléments "en clair" et les éléments "codés" ;
  • Deux paramètres définissant la méthode de correspondance ;
  • Une fonction de codage ;
  • ne fonction de décodage.
L'idée ici est de créer sa "table de correspondance personnalisée" par :
  • Mélange aléatoire des caractères ;
  • Concordance avec un ou plusieurs caractères de substitution ;
  • Utilisation d'une ou plusieurs "tables" de correspondance.

I-C. Méthode de correspondance

Table de correspondance :
  • table0 : les caractères "en clair"
  • table1 : les éléments "codés"
Méthode :
  • Paramètre "methode" : on définit combien de caractères (de table1) remplacent un caractère (de table0) ;
  • Paramètre "alterner" : on peut compliquer en alternant le codage sur 2 tables ou plus (en pratique, on créera une table à une ou plusieurs dimensions).
Les scripts d'encodage et de décodage dépendront :
  • De la table de correspondance ;
  • De la méthode choisie.

II. Explications simplifiées

II-A. Correspondance simple

Paramètre "methode" : définit combien de caractères (de table1) remplacent un caractère (de table0).

"méthode 1 pour 1" : Un caractère en remplace un
table0 a b c d e f g
table1 c g a e b d f
ex. badge --> gcefb
"méthode 2 pour 1" : Deux caractères en remplace un
table0 a b c d e f g
table1 cf ga ab ed bc dg fe
ex. badge --> gacfedfebc

Et ainsi de suite : 3 pour 1, 4 pour 1...

II-B. Alternance sur 2 tables

Paramètre "alterner" : on peut compliquer en alternant le codage sur 2 tables ou plus.

"méthode 1 pour 1 alterné" : Un caractère en remplace un
table0 a b c d e f g
table1(0) c g a e b d f
table1(1) f b g a c e d
ex. badge --> gfedb
"méthode 2 pour 1 alterné" : Deux caractères en remplace un
table0 a b c d e f g
table1(0) cf ga ab ed bc dg fe
table1(1) fd ba gf ac cb ee dg
ex. badge --> gafdeddgbc

Et ainsi de suite : alternance sur 3 tables, 4 tables...

III. Table de correspondance

Pour que le codage/décodage "fonctionne" correctement, c-à-d pour qu'on puisse récupérer la chaine initiale, il faut imposer quelques règles :

  • Éviter les caractères accentués (sinon : les prévoir dans table0) ;
  • Éviter les caractères non prévus ou interdits.
table0 : table des caractères "en clair"
- Chiffres : 0 1 2 3 4 5 6 7 8 9
- Lettres minuscules : a b c d e f g h i j k l m n o p q r s t u v w x y z
- Lettres majuscules : A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
- Caractères spéciaux : . @ - _ (pour le codage d'e-mail)
- Autres caractères : interdits (ou à prévoir et à ajouter aux caractères spéciaux)
table1 : table de correspondance "personnalisée"

26 minuscules + 26 majuscules + 10 chiffres + 4 caractères spéciaux = 66 caractères ...
On mélange tout ça de manière aléatoire, ... on fait correspondre...

Méthode :

Remplacement de caractère
  • "1 pour 1" : Un caractère en remplace un ;
  • "2 pour 1" : deux caractères en remplacent un ;
  • etc.
Alternance
  • "Simple" : la correspondance se fait sur une table ;
  • "Alterné" sur 2 tables : la correspondance alterne sur 2 tables ;
  • etc.

Les scripts d'encodage et de décodage dépendront de la méthode choisie.

Correspondance.php
Sélectionnez

<?php
// --------------------------------------------------------
// table de caracteres en clair
   $table0 = array("0","1","2","3","4","5","6","7","8","9",
"a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z",
"A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z",
".","@","-","_");
// --------------------------------------------------------
// table(s) de caracteres codes
   $table1[0] = array(...);
   // $table1[1] = array(...);
   // $table1[2] = array(...);
   // ...
// --------------------------------------------------------
// methode utilisee
   $methode = ... ;
   $alterner = ... ;
?>

IV. Script de création de la table de correspondance

La création de la table1 peut se faire :
  • "Manuellement" : on mélange "à la main" les caractères (fastidieux !) ;
  • Ou on la génère "aléatoirement" via un "script de création".
Le "script de création" suivant permet, grâce à un formulaire, de définir :
  • Le mode de remplacement de caractère ;
  • Le type d'alternance.
Après soumission :
  • Il génère automatiquement le code à insérer dans Correspondance.php ! (À utiliser une seule fois !)

La probabilité de générer 2 fois la même table de correspondance est quasi nulle !

Creation-Corresp.php
Sélectionnez

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <title>Creation-Corresp.php</title>
</head>
<body>
<form method="POST">
<b>Script de CREATION :</b><br/>
   Remplacement de caractère : 
   <select size="1" name="methode">
   <option selected value="1">1 pour 1</option>
   <option value="2">2 pour 1</option>
   <option value="3">3 pour 1</option>
   <option value="4">4 pour 1</option>
   <option value="5">5 pour 1</option>
   </select><br/>
   Alternance : 
   <select size="1" name="alterner">
   <option selected value="1">simple sur 1 table</option>
   <option value="2">alterné sur 2 tables</option>
   <option value="3">alterné sur 3 tables</option>
   <option value="4">alterné sur 4 tables</option>
   <option value="5">alterné sur 5 tables</option>
   </select><br/>
   <input type="submit" value="Generer" name="Generer">
</form>
<b>Contenu :</b><br/><br/>
<?php
// --------------------------------------------------------
// methode : nombre de caracteres de substitution
// alterner : nombre de dimension de la table a creer
   $methode = @$_POST['methode'];
   $alterner = @$_POST['alterner'];
// --------------------------------------------------------
   $table0 = array("0","1","2","3","4","5","6","7","8","9",
"a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z",
"A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z",
".","@","-","_");
// --------------------------------------------------------
// affichage de table0
   $latable0 = '$table0 = array(';
for ($i=0;$i<count($table0);$i++) {
   $latable0 .= '"'. $table0[$i] .'"';
   if ($i != count($table0)-1) {
      $latable0 = $latable0 .',';
   }
}
   $latable0 .= ');';
   echo $latable0 .'<br/><br/>';
// --------------------------------------------------------
// Script de création "aléatoire" et affichage de table1
// --------------------------------------------------------
for ($k=0;$k<$alterner;$k++) {
   // -----------------------------------------------------
   // tables de nombres aléatoires
   for ($i=0;$i<$methode;$i++) {
      $valeurs_alea[$i]=array_rand($table0,count($table0));
   }
   // -----------------------------------------------------
   // associe les elements
   $intable1 = "";
   for ($j=0;$j<count($table0);$j++) {
      $intable1 .= '"';
      for ($i=0;$i<$methode;$i++) {
         $intable1 .= $table0[$valeurs_alea[$i][$j]];
      }
      $intable1 .= '"';
      if ($j != count($table0)-1) {
         $intable1 .= ',';
      }
   }
   echo '$table1['.$k.'] = array('.$intable1.');<br/>';
}
// --------------------------------------------------------
   echo '<br/>$methode = '. $methode .';';
   echo '<br/>$alterner = '. $alterner .';';
?>
</body></html>

V. Fonctions d'Encodage/Décodage

CodeDecode.php
Sélectionnez

<?php
// --------------------------------------------------------
// fonction d ENCODAGE
function encode($chaine) {
   include("Correspondance.php");
   $chainecode = '';
   for ($i=0;$i<strlen($chaine);$i++) {
      for ($j=0;$j<count($table0);$j++) {
         if ($table0[$j]==substr($chaine,$i,1)) {
            $chainecode .= $table1[$i % $alterner][$j];
         }
      }
   }
   return $chainecode;
}
// --------------------------------------------------------
// fonction de DECODAGE
function decode($chaine) {
   include("Correspondance.php");
   $chainedecode = '';
   for ($i=0;$i<strlen($chaine)/$methode;$i++) {

      for ($j=0;$j<count($table0);$j++) {
         if ($table1[$i % $alterner][$j]==
                    substr($chaine,$i*$methode,$methode)) {
            $chainedecode .= $table0[$j];
         }
      }
   }
   return $chainedecode;
}
// --------------------------------------------------------
?>

VI. Utilisation

Utilisez 1 fois : Le script Creation-Corresp.php
"copiez-collez" le résultat dans Correspondance.php
Ensuite : Les fichiers nécessaires :
Correspondance.php
CodeDecode.php
Optimisation : Changez les noms des fichiers et fonctions pour les rendre moins "explicites" ...
ENCODAGE
Sélectionnez

<?php
// ----------------------------------------------
 include("CodeDecode.php");
// ----------------------------------------------
$chaine = 'blabla';
$chainecode = encode($chaine);
?>
DECODAGE
Sélectionnez

<?php
// ----------------------------------------------
 include("CodeDecode.php");
// ----------------------------------------------
$chainecode = 'blablacode';
$chainedecode = decode($chainecode);
?>

Protégez bien votre fichier Correspondance.php !!!

Vous pouvez aussi créer une table différente pour chaque "type de donnée" (login, mot de passe, e-mail). On peut aussi coder des noms d'images, de fichiers...

Type de donnée correspondance coder/décoder encode() decode()
Login : log-Corresp.php log-Code.php codelog() decodelog()
Mot de passe : pwd-Corresp.php pwd-Code.php codepwd() decodepwd()
E-mail : mel-Corresp.php mel-Code.php codemel() decodemel()

VII. Exemple

exemple.php
Sélectionnez

<?php // ------------------------------------------------
 include("CodeDecode.php");
?>
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <title>exemple.php</title>
</head>
<body>
<i>Exemple 1 :</i><br/>
<?php
$chaine = "1t5gH6UVm";
   echo '<i>chaine </i>: '.$chaine.'<br/>';
$chainecode = encode($chaine);
   echo '<i>codée </i>: '.$chainecode.'<br/>';
$chainedecode = decode($chainecode);
   echo '<i>décodée : </i>'.$chainedecode.'<br/>';
?>
<br/><i>Exemple 2 :</i><br/>
<?php
$chaine = 'mon-login';
   echo '<i>chaine </i>: '.$chaine.'<br/>';
$chainecode = encode($chaine);
   echo '<i>codée </i>: '.$chainecode.'<br/>';
$chainedecode = decode($chainecode);
   echo '<i>décodée : </i>'.$chainedecode.'<br/>';
?>
<br/><i>Exemple 3 :</i><br/>
<?php
$chaine = 'mail_perso@mon-hebergeur.com';
   echo '<i>chaine </i>: '.$chaine.'<br/>';
$chainecode = encode($chaine);
   echo '<i>codée </i>: '.$chainecode.'<br/>';
$chainedecode = decode($chainecode);
   echo '<i>décodée : </i>'.$chainedecode.'<br/>';
?>
</body></html>
L'exemple affiche :

Exemple 1 :
chaine : 1t5gH6UVm
codée : nHqZ8SHR5aiiipNtvA
décodée : 1t5gH6UVm

Exemple 2 :
chaine : mon-login
codée : kY45.sQhIR3_HR6L.s
décodée : mon-login

Exemple 3 :
chaine : mail_perso@mon-hebergeur.com
codée : kYgswIGICQxhw2oV--h4JIvAh4VvrY9S8KCfw2oVQ1w2PgS0Nal43_kY
décodée : mail_perso@mon-hebergeur.com


Pour cet exemple, le fichier Correspondance.php était :
(methode = 2 : "2 caractères en remplacent 1")
(alterner = 3 : "alternance sur 3 tables")

Correspondance.php
Sélectionnez

<?php
// --------------------------------------------------------
$table0 = array("0","1","2","3","4","5","6","7","8","9",
"a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z",
"A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z",
".","@","-","_");
// --------------------------------------------------------
$table1[0] = array("l0","nH","AP","sU","Vi","xV","ry","qT","SN","Cc","1q","mF","7A","Dx","w2","OD","HR",
"9S","MG","p-","63","GI","kY","4J","h4","WZ","Ue","8t","Fr","E1","06","Jk","bK","-Q","Bm","tb",".g",
"@.","ZO","u7","eM","zu","yf","2E","RC","5j","g9","aw","YX","_d","oL","f5","jn","dW","3v","Il","ip",
"c_","vB","K8","Ts","Xo","Na","Lz","Qh","P@");
// --------------------------------------------------------
$table1[1] = array("kx","wJ","@j","uF","Sc","2y","Ml","71","_U","em","gs",".2","l4","jh","8K","yd","K_",
"-b","6L","xX","pB","IR","Du","Vv","45","TT","YH","oV","si","qZ","Pg","mA","FO","U@","rS","XM","dD",
"OC","Gz","c0","Qn","A8","LY","5a","0W","H.","WN","Ee","1q","i3","3G","bw","ar","zo","hf","v6","R-",
"Nt","nE","B9","97","tp","ZP","JI","fk","CQ");
// --------------------------------------------------------
$table1[2] = array("zB","@r","5.","lm","KQ","8S","ii","E9","Ft","he","nP","Cf","gU","eE","O4","Mq","Q1",
"qu","wI","97","f2","PH","vA",".s","3_","xh","sw","S0","--","Dp","VG","dk","bl","TT","Y6","kv","Zx",
"U3","Xy","AX","RC","Gj","tz","W8","7K","2g","an","I5","mJ","0a","uR","6b","yN","JV","cD","Bc","LL",
"jZ","1M","4d","Ho","N@","oO","pW","rY","_F");
// --------------------------------------------------------
$methode = 2;
$alterner = 3;
// --------------------------------------------------------
?>

VIII. Faiblesses

Cette méthode "maison" n'offre qu'une protection de niveau 1 sur une échelle de 10 !
C'est un algorythme efficace contre les "petits curieux", mais en aucun cas contre les "pro du piratage", du fait de sa (relative) simplicité.
(voir la section "Faiblesses")
Pour une sécurité renforcée, des algorithmes bien plus puissants existent (et ont fait leurs preuves).

Le principe de codage/décodage présenté ici comporte des faiblesses en terme de sécurité.

Son efficacité peut être mise en défaut par une personne "mal intentionnée" et "perspicace" :
  • Supposons qu'il ait réussi à "pénétrer" dans la base de données (il a accès à toutes les informations, même si celles-ci sont codées) ;
  • Supposons qu'il puisse, librement, entrer des données via un formulaire utilisant la méthode de cryptage.

Il pourrait alors faire des tests, en rentrant par exemple comme valeur : "abcdefghijklmnopqrstuvwxyz" ou "0123456789", ...
Et, par comparaison/déductions, finir par décoder la méthode employée.

Bien que cette "déduction" puisse être longue et fastidieuse : "Quand on veut, on peut" !

IX. Conclusion

Pour une sécurité maximum, évitez les scripts "maison" et faites plutôt confiance aux méthodes de cryptage éprouvées et fiables.

"On trouve toujours plus malin que soi" ("malin" est à prendre au sens propre comme au figuré : "qui est porté à nuire, à faire du mal à autrui ...")

Vous avez aimé ce tutoriel ? Alors partagez-le en cliquant sur les boutons suivants : Viadeo Twitter Facebook Share on Google+   

  

Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2008 Jérôme Réaux. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Droits de diffusion permanents accordés à Developpez LLC.