Cryptage réversible de données
CrazyCat » 25/ 03/2009 15:07
PHP
|
Envoyer à un ami |
Fil des commentaires de ce billet
En PHP, il existe des méthodes de cryptage des données (MD5, SHA1, ...) mais elles ne sont pas réversibles. Le seul moyen est d'utiliser mcrypt, mais c'est un module complémentaire qui n'est pas souvent installé sur les serveurs standard.
Si vous voulez enregistrer des données cryptées et pouvoir les retrouver à l'aide d'une clé, il vous faut créer un système de sécurité, ce que fait la classe RevCrypt.
Cette classe fonctionne très simplement:
Elle est initialisée avec une phrase qui servira de clé (en fait nous utilisons son calcul SHA1), et deux méthodes sont utilisables: code et decode.
Encodage
Pour chaque caractère de la chaîne à protéger, nous allons prendre un caractère particulier de la clé et nous allons ajouter sa valeur ASCII à la valeur ASCII du caractère considéré. Une fois cette translation effectuée sur toute la chaîne, nous encodons le résultat en base64.
Decodage
A l'inverse, nous décodons le base64 de la chaîne, puis pour chaque caractère de la chaîne obtenu, nous allons prendre le même caractère de la clé et nous allons soustraire sa valeur ASCII à la valeur ASCII du caractère considéré.
Code source
<?php /** * Classe de cryptage réversible de données * * Cette classe permet de coder ou décoder une chaïne * de caractères * * @author CrazyCat <crazycat@c-p-f.org> * @copyright 2007 http://www.g33k-zone.org * @package Mephisto */ class RevCrypt { /** * Clé utilisée pour générer le cryptage * @var string */ public $key; /** * Données à crypter * @var string */ public $data; /** * Constructeur de l'objet * @param string $key Clé utilisée pour générer l'encodage */ public function __construct($key) { $this->key = sha1($key); } /** * Encodeur de chaîne * @param string $string Chaîne à coder * @return string Chaîne codée */ public function code($string) { $this->data = ''; for ($i = 0; $i<strlen($string); $i++) { $kc = substr($this->key, ($i%strlen($this->key)) - 1, 1); $this->data .= chr(ord($string{$i})+ord($kc)); } $this->data = base64_encode($this->data); return $this->data; } /** * Décodeur de Chaîne * @param string $string Chaîne à décoder * @return string */ public function decode($string) { $this->data = ''; $string = base64_decode($string); for ($i = 0; $i<strlen($string); $i++) { $kc = substr($this->key, ($i%strlen($this->key)) - 1, 1); $this->data .= chr(ord($string{$i})-ord($kc)); } return $this->data; } } ?>
Commentaires
Le 09/ 05/2009 12:28
Très sympa comme fonction.
Ce serait bien d'avoir un exemple concret.
En voici un :
<?php
include('cryptage_decryptage.inc.php');
$toto = new RevCrypt('clef');
$resultat = $toto->code('alpha');
echo "Resultat cryptage : $resultat<br>";
echo 'Retour à l original : '.$toto->decode($resultat);
?>
Merci.
Merci bien, effectivement j'aurai pu (dû) mettre un exemple.
Le 21/ 05/2009 14:38
Bonjour,
Je viens d'essayer la classe, mais j'ai un message qui dit :
Parse error: parse error, unexpected T_VAR, expecting T_VARIABLE in cryptage_decryptage.inc.php on line 19
Hors ligne 19 il y a juste : public var $key;
Peux-tu m'aider, merci.
(PHP5)
Diantre, j'ai fait une énorme erreur, je viens de corriger mon post et le .zip : c'est public $variable et pas public var $variable
Le 17/ 11/2009 16:37
Bonjour,
J'ai la même erreur que JLN, et pourtant c'est bien la structure public $variable qui est utilisé.
Quel est le problème ?
Merci,
Bonjour,
Je viens de tester la source fournie, elle fonctionne. Peut-être n'êtes vous pas en PHP5, essayez avec Classe RevCrypt PHP4 et tenez moi au courant.
Merci d'avance.
Le 05/ 07/2010 11:19
Bonjour.
J'aime bien cette classe et j'aurais voulu savoir dans quels termes l'on peut l'utiliser.
Uniquement personnel ou autant personnel que professionnel ?
Merci.
Bonjour,
Cette classe est totalement libre d'utilisation, même dans un cadre professionnel.
Tout ce que je demande, c'est de laisser dans le code les références @author et @copyright afin que les développeurs puissent me contacter en cas de souci.
Le 05/ 07/2010 12:02
Merci beaucoup pour votre rapidité de réponse et pour votre travail :)
Bonne continuation !