Faszination QR-Codes lesen: Was das Personal einer Einlasskontrolle wirklich leistet.

Corona (ja ich trau mich, dieses Wort zu schreiben) versetzt uns als Menschheit immer wieder in erstaunliche Situationen und Lebenslagen. Nicht selten liest und hört man heutzutage Berichte über Krankenhaus- und Pflegepersonal, das hart an der Belastungsgrenze arbeitet. Schockierende Bilder, unmenschliche Arbeitszeiten und unzumutbare Zustände sind fast schon allgegenwärtig geworden. Derzeit steuert alles wieder auf einen Lockdown hin. Doch in der kurzen Zeit der Möglichkeiten (als Besuche von Opern und Weihnachtsmärkten zumindest teilweise möglich gewesen sind) ist mir eine Berufsgruppe aufgefallen, die vermutlich vollständig ungeachtet der öffentlichen Wahrnehmung an der Belastungsgrenze arbeitet: Das Personal der Einlasskontrollen, die die Gültigkeit von zertifizierten Test- und Impfnachweisen kontrollieren muss.

Oftmals ist das Personal nicht einmal mit einem Lesegerät ausgestattet. Kopfrechnen steht wieder an der Tagesordnung so wie in der Grundschule. Zudem stehen dem Personal oftmals nur wenige Sekunden zur Überprüfung eines Zertifikats zur Verfügung. Was muss in dieser Zeit alles geschehen? Zur Vereinfachung nehmen wir als Übungsbeispiel diesen einfachen QR-Code. Er ist natürlich wesentlich kleiner als die Codes, die auf Impfnachweisen und auf Testzertifikaten ausgestellt sind. Dennoch kann er zur Veranschaulichung dienen.

Ein QR Code ist sehr simpel aufgebaut. Die Rede ist von einer zweidimensionalen Matrix, welche die Maße 21×21 bis 177×177 Feldern einnehmen kann. Jedes Feld kann eines der beiden Zustände Schwarz und Weiß bzw Eins und Null haben. Das ist die Art und Weise wie Daten auch in Computern gespeichert werden. Das einlassende Personal, wird allerdings nicht weit kommen, wenn es von oben nach unten und von links nach rechts die Daten einliest. Daraus ergäbe sich in unserem Fall ein Datensatz der ungefähr so aussähe

1  1  1  1  1  1  1  0  0  0  1  1  1  0  1  1  1  1  1  1  1
1  0  0  0  0  0  1  0  1  1  1  0  1  0  1  0  0  0  0  0  1
1  0  1  1  1  0  1  0  0  0  1  1  1  0  1  0  1  1  1  0  1
1  0  1  1  1  0  1  0  1  1  0  0  1  0  1  0  1  1  1  0  1
1  0  1  1  1  0  1  0  0  1  0  0  1  0  1  0  1  1  1  0  1
1  0  0  0  0  0  1  0  1  0  0  1  0  0  1  0  0  0  0  0  1
1  1  1  1  1  1  1  0  1  0  1  0  1  0  1  1  1  1  1  1  1
0  0  0  0  0  0  0  0  0  1  0  0  0  0  0  0  0  0  0  0  0
1  1  1  1  1  0  1  1  1  0  0  1  0  1  0  1  0  1  0  1  0 
0  0  0  1  1  1  0  0  0  0  0  1  1  1  1  1  0  0  1  0  1
1  0  1  0  0  1  1  1  1  1  0  0  1  0  1  1  0  1  0  1  0
1  1  1  1  1  1  0  1  1  1  0  1  1  1  1  1  0  1  1  1  1
0  0  1  0  1  1  1  0  0  1  0  0  1  0  0  0  1  0  0  0  0
0  0  0  0  0  0  0  0  1  1  1  0  1  0  0  1  1  0  0  1  0
1  1  1  1  1  1  1  0  1  0  0  1  0  1  0  0  0  0  1  1  0
1  0  0  0  0  0  1  0  0  1  0  0  0  0  0  0  0  1  1  1  1
1  0  1  1  1  0  1  0  1  1  0  1  0  1  0  0  0  0  0  1  0
1  0  1  1  1  0  1  0  1  0  1  1  1  1  1  1  1  1  0  0  0
1  0  1  1  1  0  1  0  1  1  0  0  1  0  1  0  0  1  1  0  0
1  0  0  0  0  0  1  0  1  0  1  1  1  1  1  0  0  1  1  0  0
1  1  1  1  1  1  1  0  1  0  1  0  1  0  0  0  0  1  0  1  0

Diese Daten spiegeln allerdings nicht den Inhalt des Datensatzes dar, der gelesen werden soll. Denn ein QR-Code wird nicht von oben nach unten und von links nach rechts geschrieben, sondern folgt einer gewissen Geometrie. Zunächst sind da die nicht zu übersehenden drei Markierungen zur korrekten Orientierung des Codes. Sie sagen sowohl einem Computer als auch dem kundigen Fachpersonal, in welche Richtung der QR-Code orientiert ist. Außerdem dienen sie als Orientierung für die Abstände zwischen den einzelnen Bits. Die unten in lila und hellblau markierten Bits enthalten also keine Daten sie dienen lediglich zur Orientierung.

Eine weitere Orientierungshilfe bezüglich der Abstände zwischen den einzelnen Bits bietet außerdem die sogenannte Timing-Struktur. Man kann sie sich als gepünktelte Verbindung zwischen den Orientierungseinheiten vorstellen. Dabei verläuft sie jeweils von Ecke zu Ecke der äußeren Umrandung. Ich habe sie in unserem Beispiel einmal in rosa und hellblau markiert.

Die ersten „echten“ 5 Bits müssen ausgelesen werden, um den weiteren Aufbau des Codes zu bestimmen. Diese Bits heißen auch Format-Pattern. Sie finden sich direkt unter der oberen linken Orientierungsmarkierung und direkt neben rechts unten neben der unteren Orientierungsmarkierung. Ich habe sie hier einmal in blau markiert. Diese Daten sind deshalb doppelt vorhanden, weil sie sehr wichtig sind. Computer und Menschen können manchmal schwer lesbare Dokumente vorliegen haben. (Etwa durch das Knicken des Papiers oder kleine Kratzer im Display usw) Diese Informationen sind allerdings, wie sich heruasstellen wird, sehr wichtig. In unserem Fall lauten sie 11111. Die Format-Pattern bestehen außerdem noch aus weiteren Bits, die als Fehlerkorrektur dienen. Hier sind sie einmal grün hervorgehoben. Für einen menschlichen Leser sind sie allerdings nicht relevant.

Die Fehlerkorrektur ist ebenfalls zwei Mal im QR-Code vorhanden. Die zwei Bits neben der unteren Orientierungsmarkierung müssen links unter die rechte Orientierungsmarkierung angefügt werden. So ergibt sich 0110101010. Die Daten finden sich auch, wenn man am Rand der oberen linken Orientierungsmarkierung von links nach rechts und von unten nach oben um die Ecke liest. Wichtig: Die Timing Structure (rosa und hellblau) gehört nicht zur Fehlerkorrektur des Formatcodes. Geometrische Bits werden beim Lesen generell übersprungen. Außerdem gibt es ein Bit, das immer 1 ist. Es findet sich an der oberen rechten Ecke der unteren Orientierungsmarkierung. Damit es uns beim Auslesen der Daten nicht stört, markiere ich es hier in türkiser Farbe.

Die ersten beiden Bits enthalten Informationen darüber, wie hoch das Niveau der Fehlerbehebung in diesem Code ist. Für einen menschlichen Leser ist sie irrelevant, denn ein Mensch wird sich lediglich auf die tatsächlichen Daten im Code konzentrieren und bei einem unlesbaren Code das Zertifikat vermutlich als ungültig bezeichnen. Die letzten drei Bits allerdings enthalten Informationen darüber, nach welchem Muster Bits im QR-Code geflipt wurden. Denn einige weißen Felder stellen im tatsächlichen Datensatz nicht eine null dar sondern eine eins dar – und umgekehrt.

Dieses Verfahren wird üblicherweise angewandt, um zu verhindern, dass sich größere schwarze Balken oder Flecken auf dem QR-Code finden. Denn dadurch entstehen potenzielle Lesefehler. Während ein Computer keine größeren Probleme damit hat, anhand der drei Bits eines der acht Flip verfahren anzuwenden, ist das für den ungeübten Menschen durchaus komplizierter. Ein geschulter QR-Leser wird die acht verschiedenen Kombinationen vermutlich einfach im Kopf beherrschen. Wer noch am Üben ist, kann Tabellen wie diese hier benutzen

Da unsere drei Flip-Bits den Wert 111 haben, folgen wir einem (für den Menschen) sehr einfachen Muster. Jede dritte inhaltliche Spalte wird invertiert, das betrifft die hier hellgelb markierten Bereiche.

Zum Auslesen der Daten müssen diese Bits nun also geflipt werden. Das heißt aus jedem weißen Feld wird ein schwarzes Feld und umgekehrt. Das Resultat sieht dann wie folgt aus:

Der vorliegende QR Code ist nun korrekt orientiert und die entsprechenden Bits geflipt, sodass wir mit dem Auslesen der Daten beginnen können. Die Daten sind allerdings nicht von Oben nach unten und von links nach rechts orientiert eingespeichert, sondern werden in einem Zick-Zack Muster von unten rechts nach oben Links und wieder von oben nach unten ausgelesen.

Verfährt man nach diesem Muster, erhält man endlich den erwünschten Datensatz. Dieser setzt sich wie folgt zusammen. Der erste Teil ist vier Bit lang und enthält die Information über die gespeicherte Daten-Art. (Ich markiere die Datensätze im folgenden jeweils rot.) In unserem Fall handelt es sich um reinen Byte-Code. Die Byte- Kodierung hat den Index 2, welcher im Binärcode als 0100 dargestellt wird. Dieser findet sich auch beim Auslesen der einzelnen Bits aus dem QR-Code.

Im nächsten Byte findet sich eine für den menschlichen Leser sehr wichtige Information, nämlich aus wie vielen Bytes der Datensatz besteht. Liest man diesen Byte aus, so erhält man den Binärwert 00000111 das entspricht dem dezimalen Äquivalent von 7. Wir lesen also die nächsten sieben Bytes, das entspricht 7×8 Bits, also 56 Felder:

01010011011000110110100001101101011101010110010101101100

Diese Felder beinhalten die Daten des QR-Codes. Die acht Bytes sind Darstellungen im ASCII-Format, wodurch sich jeder Byte zu einem Buchstaben zuordnen lässt. Der geübte QR-Code Leser sieht diesen Code an und kann ausrechnen, dass dort das Wort Schmuel kodiert ist.

Das Ende der Daten wird durch vier Nullen dargestellt.

Alle weiteren Daten werden üblicherweise nicht durch Menschen gelesen. Sie dienen der Korrektur von Lesefehlern und ermöglichen, dass ein Computer auch beschädigte Codes lesen kann. Der aufmerksame Leser mag nun zweierlei Dinge festgestellt haben: Erstens, dass das Lesen von QR-Codes ohne Hilfsmittel sehr sehr knifflig sein kann. Zweitens, dass sein Impf- oder Testzertifikat anders aussieht als der Schmuel QR Code.

Ersteres wird sich nur durch viel Übung beheben lassen. Zweiteres liegt daran, dass die Datenmenge in den jeweiligen Zertifikaten viel größer ist. Der Prozess des Lesens wird dadurch noch etwas komplizierter. Zunächsteinmal finden sich mehr kleinere Orientierungsmarkierungen im QR-Code. Diese haben nicht ein 3×3 Quadrat in der Mitte des Feldes, sondern lediglich einen einzigen Bit. Die Zick-Zack Muster orientieren sich dann um die Orientierungsmarkierungen herum.

Es gibt also beim Lesen des Zertifikats so einiges, auf das geachtet werden muss. Ich mag mir nicht vorstellen, wie viel Gehirnschmalz das Einlasspersonal von Theater, Bahn und Gastronomie aufbringt um hunderte dieser Codes in so kurzer Zeit mit bloßem Auge lesen zu können!

Deshalb fordere ich hier nun offiziell dazu auf, sich solidarisch mit dem Einlasspersonal zu zeigen. Bringt sauber lesbare QR-Codes mit! Achtet darauf, dass besonders die Datenbereiche des Codes sehr gut lesbar sind! Zeigt den QR-Code bereits richtig herum orientiert vor, sodass das Personal nicht noch mehr umdenken muss! Diese Schritte erfordern alle kaum Aufwand. Wer etwas Zeit investieren kann, der sollte vielleicht seine Zertifikate einscannen und die Flip-Bits digital bereits vorbereiten. Mit einem freundlichen „Ich habe die Flip-Bits für Sie bereits invertiert“ kann man dem ein oder anderen Angestellten sicher eine große Freude machen. Wenn auch nur kurz, denn der nächste Kunde in der Schlange wartet bereits auf seinen Einlass.