3 votes

XOR deux chaînes hexagonales

Je veux faire un XOR entre deux chaînes de caractères (codées en hexadécimal) en php. J'ai essayé d'utiliser l'opérateur ^, mais je n'obtiens que 0. Comment puis-je faire cela ? Pourquoi est-ce que c'est faux ?

10voto

lawl0r Points 655
<?php 
    $s1 = 'ABCDEF1234567890';
    $s2 = '0987654321ABCDEF';
    $x = bin2hex(pack('H*',$s1) ^ pack('H*',$s2));
?>

2voto

KingCrunch Points 45168
$x = dechex(hexdec($s1) ^ hexdec($s2));

http://codepad.org/fgRfAPAI

Le problème que vous avez rencontré initialement est qu'une chaîne hexadécimale est en fait une chaîne de caractères. Lorsque vous utilisez des opérateurs binaires sur des chaînes, ils utilisent les codes de caractères comme valeur d'octet.

1voto

Álvaro G. Vicario Points 57607

Vous devez les décoder avec hex2bin() avant d'appliquer le XOR ^ opérateur .

Mise à jour : J'oublie toujours que cette fonction nécessite PHP/5.4 ou plus, ce qui peut poser problème. Dans ce cas, vous devez utiliser la fonction peu intuitive pack() fonction :

$binary = pack('H*', $hexadecimal);

1voto

mag1071983 Points 91

En me basant sur la réponse de @KingCrunch ici et sur les commentaires, j'ai écrit cette simple boucle pour comparer les octets et construire la réponse. Il est intéressant de noter que cela donne le même résultat que la réponse de @lawlor.

$key1 = 'ABCDEF1234567890ABCDEF1234567890';
$key2 = '0987654321ABCDEF0987654321ABCDEF';

$key1_octets = str_split($key1, 2);
$key2_octets = str_split($key2, 2);
$xor = '';
foreach ($key1_octets as $id => $key1_octet) {
  $xor .= dechex(hexdec($key1_octets[$id]) ^ hexdec($key2_octets[$id]));
}
print $xor;

print bin2hex(pack('H*',$key1) ^ pack('H*',$key2));

Je ne suis pas sûr que l'un ou l'autre soit un résultat valide, mais je le propose pour avoir un retour d'information et au cas où cela aiderait quelqu'un d'autre qui regarde la réponse de @KingCrunch sans savoir comment traiter les octets.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X