Crypter et décrypter des données
Le principe est relativement simple, il s'agit d'utiliser une chaîne de caractères de votre choix pour encoder (ou décoder) vos données.Nous utiliserons donc une clé (votre mot de passe) qui servira à effectuer des modifications sur la chaîne à encoder.
<?
class encrypt {
var $key;
var $data;
function init($key) {
$this->sk = $key;
}
function code($string) {
$this->data = '';
for ($i = 0; $i<strlen($string); $i++) {
$kc = substr($this->sk, ($i%strlen($this->sk)) - 1, 1);
$this->data .= chr(ord($string{$i})+ord($kc));
}
$this->data = base64_encode($this->data);
return $this->data;
}
function decode($string) {
$this->data = '';
$string = base64_decode($string);
for ($i = 0; $i<strlen($string); $i++) {
$kc = substr($this->sk, ($i%strlen($this->sk)) - 1, 1);
$this->data .= chr(ord($string{$i})-ord($kc));
}
return $this->data;
}
}
?>
class encrypt {
var $key;
var $data;
function init($key) {
$this->sk = $key;
}
function code($string) {
$this->data = '';
for ($i = 0; $i<strlen($string); $i++) {
$kc = substr($this->sk, ($i%strlen($this->sk)) - 1, 1);
$this->data .= chr(ord($string{$i})+ord($kc));
}
$this->data = base64_encode($this->data);
return $this->data;
}
function decode($string) {
$this->data = '';
$string = base64_decode($string);
for ($i = 0; $i<strlen($string); $i++) {
$kc = substr($this->sk, ($i%strlen($this->sk)) - 1, 1);
$this->data .= chr(ord($string{$i})-ord($kc));
}
return $this->data;
}
}
?>
La méthode init sert uniquement à mettre en mémoire votre clé.
Les deux méthodes encode et decode fonctionnent sur le même principe (ce qui est normal).
encode()
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.
decode()
Nous commençons par repasser la chaîne en base "normale" puis, Pour chaque caractère de la chaîne, 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é.
<?
// On initialise l'objet
$test = new encrypt();
$data = "Ceci est une phrase";
// on envoit le mot de passe
$test->init('a secret key');
// Pour vérification: affichage de la phrase à coder
echo $data."\n";
// Affichage: Ceci est une phrase
$data = $test->code($data);
echo "-->".$data."<-- coded\n";
// Affichage: -->vMaD3IXI5dmUldnKmdGI5cbW1w==<-- coded
$data = $test->decode($data);
echo "-->".$data."<-- decoded\n";
// Affichage: -->Ceci est une phrase<-- decoded
?>
// On initialise l'objet
$test = new encrypt();
$data = "Ceci est une phrase";
// on envoit le mot de passe
$test->init('a secret key');
// Pour vérification: affichage de la phrase à coder
echo $data."\n";
// Affichage: Ceci est une phrase
$data = $test->code($data);
echo "-->".$data."<-- coded\n";
// Affichage: -->vMaD3IXI5dmUldnKmdGI5cbW1w==<-- coded
$data = $test->decode($data);
echo "-->".$data."<-- decoded\n";
// Affichage: -->Ceci est une phrase<-- decoded
?>
Bien entendu, vous pouvez varier les principes de codage, en faisant un pré-traitement de votre mot de passe (md5), ou en changeant la méthode de choix du caractère à utiliser, ou en utilisant autre chose que base64...
Le tout est seulement de bien penser à toujours utiliser les mêmes méthodes pour le cryptage et le décryptage.
N.B.: utiliser md5 ou sha1 pour modifier la clé est une très bonne idée car cela peut vous permettre de ne pas mettre de mot de passe ou d'utiliser un seul caractère sans que les chaînes codées ne soient lisibles.