[RESOLU] CRC

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : [RESOLU] CRC

Re: CRC

par 11inq » 20 juil. 2020, 19:04

Bah en tout cas pour contourner le problème tu peux faire un truc comme ça, je pense que ça devrait fonctionner dans tous les cas :
eval('$value = "\x'.dechex(10).'";');
hash('crc32c', $value);
Ainsi $value sera bien évalué comme "\xa" et le hash devrait correspondre.
Un gros bordel mais ça marche!
Merci à toi

Code : Tout sélectionner

$out2 = array(); $out2[0] = ''; $out2[1] = ''; $ven2 = preg_replace($get, $out, $venname); $dev2 = preg_replace($get, $out, $devname); $filtre = preg_replace($patterns, $replacements, $str); $division = strlen($filtre) / 2; $strven = "0x0A, 0x01, " .$venname. "0x00"; $venlen = preg_replace($patterns, $replacements, $strven); $vendiv = strlen($venlen) / 2; // byte lentgh $strdev = "0x0A, 0x01, " .$devname. "0x00"; $devlen = preg_replace($patterns, $replacements, $strdev); $devdiv = strlen($devlen) / 2; // byte lentgh eval('$value = "\x01\x'.dechex("$division").'\x00\x01\x00\x0D\x00\x01\x00\x08\x81\x8'.$TBBID.'\x02\x8'.$TBBID.'\x00\x00\x00\x08\x82\x9'.$TBBID.'\x01\x8'.$TBBID.'\x00\x00\x00\x08\x83\x8'.$TBBID.'\x04\x8'.$TBBID.'\x01\x00\x00\x08\x84\x9'.$TBBID.'\x03\x8'.$TBBID.'\x01\x00\x00\x05\x85\x50\x00\x00\x05\x86\x50\x00\x00\x02\x87\x0B\x88\x20\x01\x00\x64\x00\x00\x00\x00\x00\x03\x89\x80\x05\x8A\x50\x40\x00\x05\x8B\x50\x40\x00\x'.dechex("$vendiv").'\x01'.$ven2.'\x00\x'.dechex("$devdiv").'\x02'.$dev2.'\x00";'); echo hash('crc32c', $value); $bytB = "0x0". "$byt2$byt3$byt4$byt5$byt6$byt7$byt8$byt9"; echo "<br> Thunderbolt BUS ID: $TBBID"; ?>

Re: CRC

par Saian » 20 juil. 2020, 17:19

Bah en tout cas pour contourner le problème tu peux faire un truc comme ça, je pense que ça devrait fonctionner dans tous les cas :
eval('$value = "\x'.dechex(10).'";');
hash('crc32c', $value);
Ainsi $value sera bien évalué comme "\xa" et le hash devrait correspondre.

Re: CRC

par 11inq » 20 juil. 2020, 17:13

J'aurais pas du mettre ça dans PHP débutant :non: :mrgreen:

Ca se trouve qu'il y a un bug dans PHP et ça fausse le résultat

Re: CRC

par Saian » 20 juil. 2020, 17:11

Moué ben ces histoires d'hexadécimale et compagnie c'est pas si simple. J'ai fait quelques tests et je dois bien avouer que quelque chose m'échappe dans tout ça.

De base je dirai que si le code hexadécimale de la décimale 10 est a alors ce devrait être égale à "\xa" dont le code hexadécimale est a mais ça n'est pas le cas. Il doit y avoir une petite subtilité (la représentation hexadécimale retournée par dechex n'est peut être pas la même que celle utilisée avec la syntaxe \xhh ?)... et faudrait un peu (trop) de temps pour comprendre.

Je serais curieux d'avoir les explications de quelqu'un qui maîtrise bien tout ça. ^^

Re: CRC

par 11inq » 20 juil. 2020, 16:27

Le problème c'est que hash(crc32c) interprète et fait le hash des hex seulement si elle est présentée "\xVALEURHEX1\xVALEURHEX2" etc.

Re: CRC

par 11inq » 20 juil. 2020, 16:21

J'ai encore édité mon commentaire précédent. Le 0 c'est pas bon. C'est juste qu'en faisant une conversion bin2hex("\xa") tu obtiens 0a et donc en faisant un hex2bin('0a') tu obtiens bien la même chaine qu'avec "\xa". Mais ça fonctionne dans ce cas particulier seulement.

Pour moi le problème est que tu compares des choses différentes. Je sais pas si ça résout vraiment ton problème mais il suffit dans ce cas que tu n'utilises pas les double quotes sur la valeur de départ, ainsi tu obtiendras bien le même hash :
$string = '\xa';// \xa
hash('crc32c', $string);

$string = '\x'.dechex(10);// \xa
hash('crc32c', $string);
dechex(10) = a = \x61 qui est différent de \xa...

En revanche ce code est bon :
$string = "\x61";// a
hash('crc32c', $string);

$string = dechex(10);// a
hash('crc32c', $string);

Bref, tu ne peux comparer que ce qui est comparable et tout cela est très confus.

PS : et théoriquement étant donné que tu utilises une conversion dechex, la sortie de la fonction est donc sensée être hexadécimal et tu ne devrais donc pas ajouter de \x devant pour la convertir en hexa puisqu'elle est déjà hexa.
voici ce que ça donne:

Code : Tout sélectionner

<?php // resultat correct 399F7B69 $string = '\x'.dechex(10);// \xa echo hash('crc32c', $string); // = c0ccc3a8 = pas bon $string2 = dechex(10);// a echo "<br>" . hash('crc32c', $string2); // = c1d04330 $string3 = "\x61";// a echo "<br>" . hash('crc32c', $string3); // = c1d04330 $string4 = dechex(10);// a echo "<br>" . hash('crc32c', $string4); // = c1d04330 ?>

Re: CRC

par Saian » 20 juil. 2020, 16:07

J'ai encore édité mon commentaire précédent. Le 0 c'est pas bon. C'est juste qu'en faisant une conversion bin2hex("\xa") tu obtiens 0a et donc en faisant un hex2bin('0a') tu obtiens bien la même chaine qu'avec "\xa". Mais ça fonctionne dans ce cas particulier seulement.

Pour moi le problème est que tu compares des choses différentes. Je sais pas si ça résout vraiment ton problème mais il suffit dans ce cas que tu n'utilises pas les double quotes sur la valeur de départ, ainsi tu obtiendras bien le même hash :
$string = '\xa';// \xa
hash('crc32c', $string);

$string = '\x'.dechex(10);// \xa
hash('crc32c', $string);
dechex(10) = a = \x61 qui est différent de \xa...

En revanche ce code est bon :
$string = "\x61";// a
hash('crc32c', $string);

$string = dechex(10);// a
hash('crc32c', $string);

Bref, tu ne peux comparer que ce qui est comparable et tout cela est très confus.

PS : et théoriquement étant donné que tu utilises une conversion dechex, la sortie de la fonction est donc sensée être hexadécimal et tu ne devrais donc pas ajouter de \x devant pour la convertir en hexa puisqu'elle est déjà hexa.

Re: CRC

par 11inq » 20 juil. 2020, 15:52

Merci ça semble fonctionner merci mais quand je "echo $string1" ou $string2 je ne vois aucun résultat du coup je sais pas comment il est interprété et du coup comment faire le hash en mélangeant plusieurs donnés. Si tu as une idée stp.

Code : Tout sélectionner

<?php echo dechex(10) . "<br>"; // = a echo dechex(11) . "<br>"; // = b $string1 = hex2bin('0'.dechex(10)); $string2 = hex2bin('0'.dechex(11)); $string3 = "\xa"; echo hash('crc32c', "\xa"); // = 399f7b69 = ok echo hash('crc32c', "xa"); // = 4081708c = incorrect echo hash('crc32c', $string1); // ok echo hash('crc32c', $string2); // ok echo hash('crc32c', $string3); // ok ?>


et tu peux m'expliquer à quoi sert le '0' de hex2bin('0'.dechex(10));
à quoi correspond


hex2bin pour convertir en binaire mais quand je hash directement la valeur binaire le résultat est incorrect
hex2bin('0'.dechex(10)); // = 1010
echo hash('crc32c', "1010"); // = 598a0112 = pas bon

Re: CRC

par Saian » 20 juil. 2020, 14:44

J'ai édité mon précédent commentaire, une solution qui fonctionne pour \xa :
$string = hex2bin('0'.dechex(10));
hash('crc32c', $string);
à tester pas sur que ce soit 100% fiable.

EDIT : bien ce que je pensais, ce n'est pas fiable, ça fonctionne juste dans le cas particulier présenté.

En fait pour moi le problème c'est que \xa n'est pas un code hexadécimal, il est incomplet.
Donc je sais pas si ça résout vraiment ton problème mais il suffit dans ce cas que tu n'utilises pas les double quotes sur la valeur de départ, ainsi tu obtiendras bien le même hash :
$string = '\xa';
hash('crc32c', $string);

$string = '\x'.dechex(10);
hash('crc32c', $string);

Re: CRC

par 11inq » 20 juil. 2020, 14:37

Pourquoi utilises tu \x ?
parce que c'est la méthode qui permet que le checksum soit traité en tant que hex, sinon c'est un string normal donc pas bon pour mon cas

Re: CRC

par 11inq » 20 juil. 2020, 14:30

je suis obligé d'utiliser dechex car sur une autre page l'utilisateur tape un numéro normal en décimal, je le récupère transforme en hex pour faire un checksum

ce petit bout de php s'intègre dans un project beaucoup plus complexe et je suis bloqué à cause de ça

une partie du code:

Code : Tout sélectionner

$strven = "0x0A, 0x01, " .$venname. "0x00"; $venlen = preg_replace($patterns, $replacements, $strven); $vendiv = strlen($venlen) / 2; // byte lentgh $strdev = "0x0A, 0x01, " .$devname. "0x00"; $devlen = preg_replace($patterns, $replacements, $strdev); $devdiv = strlen($devlen) / 2; // byte lentgh $div2 = dechex($division); $vendiv2 = dechex($vendiv); $devidiv2 = dechex($devdiv); // il faut des guillmets " " pour que la valeur soit correctement affiché à la sortie, les 0x0 des dechex peuvent poser problème. $inputhex = "\x01\x$div2\x00\x01\x00\x0D\x00\x01\x00\x08\x81\x8$TBBID\x02\x8$TBBID\x00\x00\x00\x08\x82\x9$TBBID\x01\x8$TBBID\x00\x00\x00\x08\x83\x8$TBBID\x04\x8$TBBID\x01\x00\x00\x08\x84\x9$TBBID\x03\x8$TBBID\x01\x00\x00\x05\x85\x50\x00\x00\x05\x86\x50\x00\x00\x02\x87\x0B\x88\x20\x01\x00\x64\x00\x00\x00\x00\x00\x03\x89\x80\x05\x8A\x50\x40\x00\x05\x8B\x50\x40\x00\x0$vendiv2\x01$ven2\x00\x$devidiv2\x02$dev2\x00"; $bytB = "0x0". "$byt2$byt3$byt4$byt5$byt6$byt7$byt8$byt9"; echo $inputhex . "<br>"; echo hash('crc32c', $inputhex, false); ?> <html lang="en"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <br>



peut être que dans ce code mon script n'est pas à jour mais en tout cas dans une version orignal tout fonctionne comme je souhaite sauf quand j'intègre dechex()

Re: CRC

par Saian » 20 juil. 2020, 13:50

Et bien je ne sais pas, ce que tu essaies de faire semble ne pas avoir de sens. Pourquoi cherches tu à hasher une chaine \x + dechex(10) ? \xa c'est sensé représenter quoi comme caractère ? quel intérêt d'utiliser dechex(10) au lieu d'utiliser directement le caractère a ? Pourquoi utilises tu \x ?

EDIT tu peux essayer quelque chose dans le genre :
$string = hex2bin('0'.dechex(10));
hash('crc32c', $string);

Re: CRC

par 11inq » 20 juil. 2020, 13:37

d'accord merci, mais est ce qu'il y a une possibilité d'utiliser dechex() à l'intérieur de hash() et avoir un résultat correct?

Re: CRC

par Saian » 20 juil. 2020, 13:33

Salut, quand tu utilises \x dans une chaine entre double quotes (") c'est pour déclarer un caractère en hexadécimal \xhh de code hh comme tu peux le voir ici :
https://www.php.net/manual/fr/regexp.re ... escape.php

Par exemple le a en hexadécimal donne 61 et echo "\x61" affiche bien un a (mais echo '\x61' affiche \x61).

Donc "\xa" c'est à priori un code hexadécimal incomplet, je ne saurai dire exactement comment c'est traité. Tu obtiens le hash de la conversion de \xa.
'"\xa"' ici l'hexadécimal est carrément ignoré la chaine étant entourée de simple quotes. Tu obtiens donc le hash de "\xa" et non de \xa.
Et pour finir "\x".'a' est interprété comme '\xa' le "\x" entre double quotes ne subissant apparemment aucune transformation. Tu obtiens donc le hash de \xa (et non de sa conversion).

Tu obtiens donc logiquement 3 résultats différents.

Re: CRC

par 11inq » 20 juil. 2020, 12:32

Bonjour merci pour ton aide,
j'ai vu que crc32c est supporté nativement depuis php7 via hash('crc32c', $data)

du coup j'ai essayé et trouvé une solution pour faire un hash sur des bytes mais je suis face à un problème quand je veux faire fonctionner dechex à l'intérieur de hash, le résultat affiché n'est pas du tout correct, voici mon code:

Code : Tout sélectionner

<?php $brut = "\xa"; // le hash de ça est correct c'est a dire 399F7B69 $premiere = '"\x'. dechex(10) .'"'; // affiche dd36db2f qui est incorrect $deuxieme = "\x". dechex(10); // affiche c0ccc3a8 donc incorrect echo hash('crc32c',$deuxieme, false); echo "<br> $premiere"; echo "<br> $deuxieme"; ?>

dechex(10) = a