Fonction PHP - XOR [Résolu]

Messages postés
49
Date d'inscription
samedi 7 juillet 2007
Dernière intervention
5 mai 2017
- - Dernière réponse : jarodjarod
Messages postés
49
Date d'inscription
samedi 7 juillet 2007
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.
Afficher la suite 

Votre réponse

2 réponses

Meilleure réponse
Messages postés
1310
Date d'inscription
samedi 31 janvier 2009
Dernière intervention
5 juin 2013
1
Merci
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.

Dire « Merci » 1

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 104 internautes ce mois-ci

Commenter la réponse de TychoBrahe
Messages postés
49
Date d'inscription
samedi 7 juillet 2007
Dernière intervention
5 mai 2017
0
Merci
Bonjour TychoBrahe,

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

Bonne journée mon ami.
Commenter la réponse de jarodjarod

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.