Fonction PHP - XOR

Résolu
jarodjarod Messages postés 49 Date d'inscription samedi 7 juillet 2007 Statut Membre Dernière intervention 5 mai 2017 - 10 juin 2010 à 01:12
jarodjarod Messages postés 49 Date d'inscription samedi 7 juillet 2007 Statut Membre Dernière intervention 5 mai 2017 - 10 juin 2010 à 11:11
bonsoir à tous,

Voilà, j'utilise téléchargé un code source de stéganographie en php, j'ai pas compris une fonction de XOR, je veux dire son utilité, la voici :

/*
* This function applies a XOR operation to a string
* Return : The xored string
*/
function XorString($string,$passphrase) {
$return="";

for($i=0;$i<strlen($string);$i++)
$return.=$string[$i]^$passphrase[$i%strlen($passphrase)];

return $return;
}

dans les commentaire, je sais, ca dit que c'est une fonction qui applique un XOR sur une chaine de caractére, et retourne une chaine xoré, MAIS JE COMPREND PAS PKOI, apres que la chaine soit xoré, qu'est ce qu'on a gagné, c koi xoré deja, et c koi l'utilité du XOR.

Enfin, J'espere que j'été clair.
Merci bcp de vos réponse mes amis.

2 réponses

TychoBrahe Messages postés 1309 Date d'inscription samedi 31 janvier 2009 Statut Membre Dernière intervention 5 juin 2013 12
10 juin 2010 à 09:14
Salut,

Le chiffrage dit "xor" est un type de chiffrage très basique et peu sécurisé. Cette fonction permet de chiffrer une chaîne de cette manière.

Petit retour sur l'opérateur logique xor (^) :
En mémoire, toutes les données sont représentées sur un certain nombre d'octets, eux même composés de 8 bits (valant chacun 0 ou 1). L'opérateur xor est un opérateur bit à bit qui répond à la table de vérité suivante :
1 ^ 1 = 0
1 ^ 0 = 1
0 ^ 1 = 1
0 ^ 0 = 0
C'est le ou exclusif, il faut que un des opérandes soit vrai mais pas les deux. Cette opération à une propriété bien pratique : en ré-appliquant le même xor on retrouve la donnée originale. Prenons l'exemple d'une suite d'un octet chiffré bit à bit en fonction d'un autre octet :

Donnée initiale : 00101101
masque binaire utilisé pour chiffrer cet octet : 11101001

   00101101
 ^ 11101001
------------
   11000101

On obtient un résultat qui est notre donnée chiffrée. Si on ré-applique le même xor sur ce résultat :
   11000101
 ^ 11101001
------------
   00101100

On a bien retrouvé la chaîne d'origine.

Maintenant considérons une chaîne de caractère que nous allons chiffrer avec un xor d'une taille d'un caractère. Chaque caractère étant une série de bit de même taille que notre masque binaire, on applique ce masque a chaque caractère 1 à 1 afin d'obtenir la chaîne chiffrée. Ça fonctionne, mais niveau sécurité c'est proche de la nulité, un tel chiffrage se casse par force brute en quelques secondes. Ici ta fonction permet de chiffrer non pas avec 1 seul caractère comme masque, mais toute une chaîne (c'est plus sécurisé mais reste loin d'un véritable chiffrage).

Analysons la fonction que tu montres :
function XorString($string,$passphrase)
Cette fonction chiffre donc $string en utilisant $passphrase comme masque binaire.

$return ="";
C'est dans cette variable que l'on stocke la chaîne chiffrée.

for($i=0;$i<strlen($string);$i++)
On tourne pour chaque caractère de la chaîne de base.

[i]$return.=$string[$i]^$passphrase[$i%strlen($passphrase)];/ib
Donc pour chaque caractère, on applique le masque et on le concatène à la chaîne de retour.

return $return;
Il n'y a plus qu'a retournée la chaîne de retour.

Revenons sur l'application du xor :
$string[$i]^$passphrase[$i%strlen($passphrase)]
$string[$i] est le caractère de la chaîne $string à la position $i.
^ est l'opérateur xor
$passphrase[$i%strlen($passphrase)] est le caractère de la chaîne $passphrase à la position $i%strlen($passphrase). Pourquoi choisir $i%strlen($passphrase) ? Simplement parce que l'on ne chiffre pas avec 1 seul caractère mais potentiellement bien plus. Si la chaîne servant de masque est plus courte que la chaîne a chiffrer, il faut la reprendre au début. Ce calcul permet d'obtenir le bon caractère à utiliser.

Une petite remarque juste comme ça : c'est pas top de laisser les strlen() dans des boucles, ça nécessite de recalculer la longueur des chaînes à chaque fois. Calculer la longueur des deux chaînes une seule au début économisera beaucoup de temps d'exécution.
1
jarodjarod Messages postés 49 Date d'inscription samedi 7 juillet 2007 Statut Membre Dernière intervention 5 mai 2017
10 juin 2010 à 11:11
Bonjour TychoBrahe,

Merci bcp pour tes explication, j'ai bien compris l'utilité du ou exclusif maintenant.

Bonne journée mon ami.
0
Rejoignez-nous