
Billet de transport QR code : pourquoi il marche sans réseau
Dans une station de métro fréquentée, un portillon laisse passer une trentaine de personnes par minute, souvent deux niveaux sous terre, sans réseau utilisable. Ces deux contraintes déterminent presque tout dans la conception d'un QR code de transport : le portillon ne peut pas demander à un serveur si votre titre est valable, et il n'a pas le temps d'y réfléchir.
Le portillon ne peut pas appeler la maison
Un billet d'événement, lui, repose presque toujours sur une interrogation à distance. Le symbole ne transporte qu'un identifiant tiré au hasard : la borne l'envoie à un serveur, et c'est le serveur qui tranche entre billet recevable et billet déjà utilisé. C'est le mécanisme que détaille comment fonctionne la validation d'un billet, et il convient parfaitement à l'entrée d'un salon, là où le WiFi est disponible et où quelques secondes d'attente supplémentaires se résorbent dans la file.
Un portillon de transport est une autre pièce. Il se trouve dans un tunnel, ou dans une mezzanine sous une dalle de béton, ou dans une station dont la liaison tombe pendant des travaux de voie. Quarante portillons qui frappent tous un même service central à 8 h 40 est en outre un profil de trafic dont personne ne veut faire dépendre l'heure de pointe du matin. Les réseaux de transport poussent donc la décision à l'intérieur du portillon. La machine devant vous décide, sur place, sans aucun aller-retour.
Signé, pas consulté
Si le portillon décide seul, le titre doit porter sa propre preuve, et c'est ce qu'est une charge signée. À l'intérieur du code se trouvent les données du titre : type de produit, fenêtre de validité, droit de zone ou de ligne, heure d'émission, numéro de série. À côté se trouve une signature cryptographique produite avec une clé détenue par l'émetteur. Chaque portillon détient la clé de vérification correspondante.
La vérifier, c'est de l'arithmétique sur des données que le portillon possède déjà. Cela coûte une fraction de milliseconde et ne demande rien au réseau. Ce que cela prouve, c'est la paternité : l'exploitant a émis ce titre, et pas un octet n'a été modifié depuis. Ce que cela ne peut pas prouver, c'est la fraîcheur. Une signature ne dit rien sur le fait que ce même titre est passé au portillon 12 il y a quatre-vingt-dix secondes.
La fraîcheur se traite à l'étage au-dessus. Les portillons gardent une liste locale des numéros de série qu'ils ont déjà admis et échangent cette liste avec le contrôleur de station à l'intervalle propre au système, parfois quelques secondes, parfois quelques minutes. Un titre présenté deux fois au même portillon est refusé immédiatement. Présenté à deux portillons dans une même fenêtre de synchronisation, il peut passer aux deux. Les exploitants acceptent cet écart exprès, parce que le fermer voudrait dire faire dépendre chaque entrée d'un réseau que la station ne peut pas promettre. Le même arbitrage apparaît dans l'autre sens dans si les QR codes fonctionnent sans internet.
Le budget au portillon est optique, pas calculatoire
Toute la transaction, depuis le moment où vous levez votre téléphone pour flasher jusqu'à celui où la barrière se libère, dispose de quelques centaines de millisecondes avant que la file derrière vous ne le remarque. La vérification de signature est le poste le moins cher de la liste. Le poste coûteux, c'est l'obtention d'une image propre.
Lire un code est une boucle sur des images vidéo : exposer, faire la mise au point, seuiller l'image en sombre et clair, chercher les trois carrés d'angle, échantillonner la grille, corriger les erreurs, décoder. À trente images par seconde, chaque tentative ratée coûte environ trente-trois millisecondes, donc l'écart entre une lecture à la première image et une lecture à la dixième est l'écart entre un portillon qui paraît instantané et un portillon qu'on insulte. Rien dans le titre n'y change quoi que ce soit. L'image, si.
Ce qui veut dire que la part contrôlée par le passager vaut d'être connue. Tenez l'écran bien à plat et parallèle à la fenêtre du lecteur plutôt qu'en biais. Remplissez la fenêtre, parce que la plupart des lecteurs de portillon sont à mise au point fixe avec une faible profondeur de champ, et qu'un code tenu trop loin est un petit code. Immobilisez-vous le temps d'un battement au lieu de faire passer le téléphone en glissant, car un glissement offre au lecteur un flou de mouvement sur chaque image.
La luminosité, et un écran fissuré
Un écran de téléphone est un émetteur, et le lecteur sous la vitre du portillon a en général son propre éclairage pointé droit vers lui. Ces deux sources de lumière se battent. Un écran à vingt pour cent de luminosité dans une station éclairée comme un bloc opératoire ne donne au lecteur presque aucune séparation entre modules sombres et clairs, et la luminosité automatique n'aura pas eu le temps de suivre puisque vous venez tout juste de réveiller le téléphone. Mettez la luminosité au maximum avant d'arriver au portillon. Certaines applications de transport le font pour vous pendant qu'un titre est à l'écran, ce qui est bon signe sur l'application.
Une fissure en travers du code est un problème plus difficile qu'il n'y paraît. La correction d'erreurs répare les modules manquants ou mal lus jusqu'à une proportion fixée, et les niveaux et ce qu'ils apportent en expliquent l'arithmétique. Une fissure n'enlève pas de modules ; elle ajoute par-dessus une ligne spéculaire lumineuse, que le seuillage lit comme du clair partout où elle tombe. Déplacez le code vers une partie intacte de l'écran si l'application permet de défiler ou de tourner, et inclinez le téléphone de quelques degrés pour que la lampe du lecteur se reflète sur la fissure ailleurs que dans l'objectif. Si la fissure traverse un carré d'angle, le portillon ne trouvera pas le code du tout, et la réponse est le guichet. Les codes lus sur un autre écran traitent la même physique dans le cas général.
Pourquoi une capture d'écran marche parfois
C'est la question que tout le monde pose, et la réponse est réellement conditionnelle.
Une capture d'écran marche quand le titre est une charge signée fixe et que le portillon vérifie hors ligne. La signature est encore valide dans l'image, le portillon n'a aucun moyen de savoir qu'il s'agit d'une copie, et la barrière s'ouvre. C'est la même propriété qui fait marcher le titre dans un tunnel.
Une capture d'écran échoue si l'une de ces trois choses est vraie. Le code tourne, et celui qui a été capturé est périmé en quelques secondes. Le portillon a bien atteint le réseau, a trouvé le numéro de série déjà marqué comme utilisé, et a refusé. Ou l'exploitant lie le titre à un appareil ou à une session d'application active, si bien que le carré à l'écran n'est pas la seule chose contrôlée.
La conclusion pratique pour un passager, c'est qu'une capture d'écran est une sauvegarde raisonnable contre une application morte ou un portail WiFi captif, et un mauvais plan comme titre unique. La conclusion pour un exploitant, c'est que des titres signés hors ligne et une application stricte de l'usage unique ne peuvent pas être complets tous les deux en même temps.
Et en France ?
De nombreux réseaux de transport urbain français permettent désormais d'acheter un titre dans leur application et de le valider en présentant un QR code au valideur, sans ticket papier ni carte. À la SNCF, l'e-billet porte lui aussi un code lu par les contrôleurs.
Deux conseils pratiques valent pour tous ces réseaux. Achetez et affichez votre titre avant de descendre dans la station, là où le réseau est encore bon. Et ne comptez pas sur une capture d'écran : beaucoup de titres mobiles sont animés ou renouvelés en permanence précisément pour qu'une copie ne fonctionne pas, et un contrôleur saura faire la différence.
Les codes tournants, et le passage par compte qui leur fait concurrence
Un titre dynamique régénère son code toutes les quelques secondes à partir d'un secret stocké dans l'application et de l'heure. Les portillons le vérifient sans réseau, car ils connaissent le même secret et partagent la même horloge, et une capture d'écran devient inutile presque aussitôt. Le coût retombe sur le voyageur : une application, un compte, une batterie chargée, et une connexion à un moment donné avant le trajet pour recevoir le secret. Les grands réseaux l'assument ; les petits doivent se demander ce qu'ils achètent, un calcul identique à celui détaillé dans l'accueil d'un événement par QR code.
Puis il y a la chose qui paraît identique au portillon et qui n'est pas un titre du tout. Dans la billettique adossée au compte, le code identifie un compte plutôt qu'un trajet. Le portillon ne contrôle pas un tarif ; il vérifie si cet identifiant figure sur la liste locale d'acceptation, s'ouvre, et remonte le passage. Le tarif est calculé plus tard par le système central, et c'est pourquoi ces systèmes peuvent plafonner la dépense quotidienne, vous facturer après coup le moins cher de deux produits, et laisser un solde devenir brièvement négatif. Un code de titre répond à la question de savoir si ce trajet est payé. Un code de compte répond à la question de savoir si ce voyageur est en règle. Les deux sont des carrés noir et blanc, la machinerie derrière eux n'a presque rien en commun, et cela explique pourquoi un exploitant peut corriger votre droit à distance quand un autre vous dit d'acheter un nouveau titre. Les parcs de stationnement tombent dans la même confusion, où un code d'abonnement et un code de paiement sont traités comme une seule chose.
La prochaine fois qu'un portillon vous refuse, notez de quelle défaillance il s'agissait : aucune lecture du tout, ce qui est de l'optique, ou une lumière rouge avec un message, ce qui est le titre. La première vous appartient et se répare en deux secondes, en montant la luminosité de l'écran et en tenant le téléphone à plat contre la vitre. La seconde, c'est le guichet. QRolling n'émet pas de titres de transport ; nos codes couvrent les URL, le texte, les coordonnées et le reste de la liste du générateur, et chacun d'eux est dynamique, la destination restant modifiable sur l'offre payante.


