Le principe du code PHP est d'envoyer un message composé que de "0" sauf pour un seul bit:
si le serveur répond "1", c'est que ce bit est à "1" (car le serveur fait un & binaire
avec le secret avant de nous dire si le nombre de "1" du résultat est impair), sinon, il est à 0
On dispose de quelques essais en plus, qui vont servir à déterminer le bit "menti" par dichotomie:
le PHP affiche maintenant la valeur SECRET qu'il a déterminée, et il tente de savoir quel
bit est inversé (j'ai forcé le secret à 0, et le mensonge au 1er bit pour tester)
On envoie un payload de 64 "0" suivit de 64 "1": si la parité retournée correspond à celle qu'on a
(Parity Matches), alors le mensonge est sur les bits "0" (l'un des 64 premiers), sinon,
sur l'un des 64 derniers
Après ce premier payload, on a donc divisé par 2 les emplacements possibles du mensonges:
on va réitérer les payloads jusqu'à n'avoir qu'un seul bit
Le second payload est une succession de 32 "0", puis 32 "1", puis 32 "0" puis 32 "1",…
Voici un exemple sur 8 bits de l'algorithme, pour aider à la compréhension du système de parité.
On rappelle que le serveur répond "1" s'il y a un nombre impair de "1" dans
Message reçu par python &_binaire Secret,
sauf dans 1 seul cas, où le serveur va mentir