De twee-dimensionale streepjescode die het coronavirus moet beteugelen
QR-codes bestaan al 25 jaar, maar pas sinds ‘corona’ staan ze in het middelpunt van de belangstelling. In de QR-code en de Corona Check app zit allerlei wiskunde en cryptografie verborgen. Zie deze explainer.
Makkelijk leesbaar voor de scanner
Een QR-code is het gevanceerde broertje van de al veel langer gebruikte streepjescode. Een standaard streepjescode bevat maar weinig informatie, het equivalent van een stuk of tien decimale cijfers. Dat komt omdat een streepjescode eigenlijk 1-dimensionaal is: de hoogte van de streepjes heeft geen betekenis, maar de opeenvolging van dikke en dunne streepjes vormt een soort morse-code. Een QR-code codeert informatie wel 2-dimensionaal: elk mini vierkantje (pixel) staat voor 1 bit (zwart is 1, wit is 0, of omgekeerd). De grootste standaard afmeting QR-code kan meer dan vierduizend letters coderen, ongeveer een A4-tje tekst.
De reden om informatie op deze manier te representeren is, dat die makkelijk leesbaar is voor een scanner. De meeste mobiele telefoons hebben tegenwoordig een camera die ook QR-codes kan lezen. Als de informatie eenmaal digitaal beschikbaar is, zijn ook automatische vervolgacties mogelijk: bijvoorbeeld dat je telefoon meteen de webpagina opent waarvan de URL in de QR-code staat. Fraudeurs hebben die kans ook al gegrepen: omdat het scannen van een QR-code zo makkelijk gaat, letten mensen soms niet goed op wat je telefoon daarna eigenlijk uitspookt, zoals een elektronische betaling klaar zetten voor bevestiging met een heel ander bedrag dan bij de QR-code staat.
Het gebruiksgemak van de QR-code, en de mogelijkheid om QR-codes on line te updaten, waren reden om die tot de spil van de corona check-app te maken. Zoals iedereen inmiddels weet, geeft zo’n QR-code op je telefoon na scannen een groen of een rood vinkje, wat in tijden van selectieve lockdown bepaalt of je bij een restaurant, bioscoop of theater naar binnen mag.
Peter Boncz (onderzoeker en MT-lid van het Centrum Wiskunde & Informatica (CWI) en verbonden aan de Vrije Universiteit als hoogleraar large scale analytical data systems) is lid van de begeleidingscommissie Digitale Ondersteuning Bestrijding Covid-19, die nauw betrokken was bij de ontwikkeling van de corona check-app. Ze geven het ministerie van VWS gevraagd en ongevraagd advies, al is het nog de vraag of laatstgenoemd mandaat onder het nieuwe kabinet blijft bestaan.
Boncz: “De corona check-app is in 2021 ontwikkeld, in de uitloop van de tweede coronagolf, toen de vaccinatie in Nederland nog niet op gang gekomen was. Hij is eigenlijk geboren met de focus op ‘testen voor toegang’ als middel om de epidemie onder controle te krijgen. Pas later is dit systeem van QR-codes verbreed naar ofwel via vaccinatie ofwel een negatieve test toegang krijgen tot horeca en allerlei evenementen.”
Robuust leesbare code dankzij foutcorrectie
Alle QR-codes bevatten een aantal vaste elementen en gebruiken gegevenscodering die tot op zekere hoogte foutcorrectie mogelijk maakt. QR-codes worden immers gebruikt in dagelijkse situaties, met grote variatie in belichting en in de hoek waaronder gescand wordt. Ook kunnen geprinte QR-codes vuil worden en slijten. Daardoor worden sommige pixels verkeerd of niet afgelezen. Zonder indeling in blokjes en foutcorrectie zou 1 ontbrekende pixel de hele boodschap al onleesbaar maken.
Makkelijk zichtbaar in elke QR-code zijn de drie vierkanten op de hoeken. Aan de hoek zonder vierkant ziet de scanner hoe hij de QR-code rechtop moet zetten voor het aflezen. Grote QR-codes hebben op vaste plaatsen ook nog kleinere vierkantjes. Die helpen de scanner om een vervormd beeld virtueel weer recht te trekken.
De inhoud van de QR-code is verdeeld in blokken van 8 bits. Er zijn dus 2^8 = 256 combinaties van 8 bits mogelijk. Aan elk blok wordt een aantal parity-bits toegevoegd, bits die het mogelijk maken om een zeker aantal bits per blok te corrigeren als die fout, of niet, zijn afgelezen.
Een simpel voorbeeld zou zijn, dat een parity bit aangeeft of het aantal 1-en in dat blok even (1) of oneven (0) is. Als de scanner een oneven aantal enen afleest terwijl de parity bit 1 is, weet je meteen dat er een fout in dat blok zit. Uiteraard is het ook nog mogelijk dat de parity bit verkeerd wordt afgelezen, dus waterdicht is deze check niet.
In QR-codes worden daarom volgens een veel gecompliceerder systeem, de Reed Solomon foutcorrectie, aan elk blok meerdere extra bits toegevoegd. Er zijn diverse niveaus van foutcorrectie mogelijk, waarbij meer fout afgelezen bits per blok kunnen worden gecorrigeerd naarmate je meer extra bits toevoegt.
De Reed Solomon foutcorrectie is bij uitstek geschikt om scanfouten te corrigeren waarbij een heel stuk van de QR-code niet meer af te lezen is, bijvoorbeeld omdat er een vlek op zit. De foutcorrectie is zelfs zo goed, dat het mogelijk is om het logo van een bedrijf in een QR-code te verwerken terwijl alle essentiële informatie dan toch nog correct wordt afgelezen.
De Nederlandse QR-code Ter bescherming van de privacy levert scannen van de Nederlandse QR-code maar heel summiere informatie op: een groen of rood vinkje, de beginletters van voor en achternaam, en het geboortejaar. Een scanner kan dus niet zien of je je groene vinkje hebt ‘verdiend’ met vaccinatie, een negatieve test of een herstelbewijs. Die informatie staat gewoon niet in deze QR-code. Hetzelfde geldt voor de uitgeprinte Nederlandse QR-code Om te voorkomen dat mensen met screenshots van andermans QR-code op hun telefoon binnen proberen te komen, is een continue lopende animatie toegevoegd, en worden QR-codes in je telefoon elke halve minuut door de corona check-app ververst en bevatten die een time stamp. Op basis daarvan accepteert de scanner alleen QR codes die minder dan zestig seconden geleden getoond werden. Deze extra beveiliging ontbreekt natuurlijk op de uitgeprinte QR-code, want die blijft altijd hetzelfde. De informatie met je groene-vinkje status binnenin de QR-code zelf blijft 24 uur geldig, daarna moet de corona-check app opnieuw gesynchroniseerd worden met een centrale server van het ministerie van VWS (de informatie in een uitgeprinte QR-code, daarentegen, is 9 maanden geldig). Boncz: “Dat is zo gebouwd omdat we vonden dat het systeem ook offline moet kunnen werken. Je wilt niet, dat als er een lange rij wachtenden voor de ingang staat en de internetverbinding valt uit, dat dan het hele systeem niet meer werkt. Want dan ontstaat er heel veel druk op de controleurs om toch maar mensen binnen te laten.” |
De internationale QR-code
De internationale QR-code is bedoeld om als reiziger toegelaten te worden tot een ander land. Daarom staat daar de volledige naam in, en alle informatie over de coronastatus van die persoon: welke vaccinaties en wanneer, of die persoon covid-19 gehad heeft en wanneer, en wanneer die eventueel getest is op covid-19. Die internationale QR-code blijft ook hetzelfde; die ‘verspringt’ niet op je telefoon. Het is wat dat betreft equivalent aan een papieren paspoort met een geel vaccinatieboekje erbij.
Gevaccineerd en toch positief getest
Wie dubbel gevaccineerd is, kan toch geinfecteerd raken en besmettelijk zijn voor anderen. Zelfs de booster reduceert die kans niet tot nul. Toch behoudt iemand die volledig gevacineerd is en positief test bij de GGD, zijn QR-code die hem een groen vinkje bij de deur van de bioscoop oplevert. Is dat niet onrechtvaardig, en een onnodig risico?
Tweede Kamerlid Liane den Haan diende hierover een motie in, met de vraag of de QR-code dynamisch gemaakt kan worden. Boncz: “Ja, dat kan, maar het is zeker voor geprinte QR-codes niet makkelijk. De scanner die zo’n QR-code afleest, zou dan contact moeten maken met de centrale GGD-server om te checken of die persoon niet recent positief getest is. Maar die scanner is vaak een app op een telefoon die door gewone burgers gebruikt wordt, en die ook offline moet werken.”
Een mogelijkheid is dan een ‘blokkeerlijst’ van positief geteste mensen die regelmatig geactualiseerd wordt en die de telefoon van de scanner downloadt naar de telefoon, maar dat kost veel data en geheugenruimte. “Eerlijk gezegd”, aldus Boncz, “vindt de commissie deze kwestie, van mensen die positief getest zijn en toch uit gaan, niet heel relevant. Waarom zou je de moeite nemen om je te laten testen als je toch al van plan was om de uitslag te negeren? Een groter probleem is waarschijnlijk, dat mensen die volledig gevaccineerd zijn zich, als ze lichte symptomen hebben, niet laten testen en dan toch uitgaan.”
Kun je een valse QR-code aanmaken?

Nu zou je kunnen denken, dat het een koud kunstje is om een valse QR-code aan te maken, zeker als je de geprinte versie mag laten zien als toegangsbewijs. Immers, je kunt op internet gratis elke gewenste informatie laten omzetten in een QR-code, bijvoorbeeld hier
Maar de QR-code bevat een slim gecodeerde handtekening, die garandeert dat deze echt door de GGD is afgegeven.
Daarvoor wordt een systeem gebruikt met twee digitale sleutels: een publieke sleutel, die iedereen mag zien en downloaden, en een geheime sleutel, die, in dit geval, alleen de GGD heeft.
Met beide sleutels kan je een tekst versleutelen, dus omzetten in een schijnbaar random letterbrij, terwijl de complementaire sleutel die letterbrij dan weer ontsleutelt tot leesbare tekst. In een veel gebruikt systeem van dit type, RSA , vormen twee zeer grote priemgetallen de basis voor de geheime sleutel, terwijl hun product de basis van de publieke sleutel vormt.
De digitale ‘handtekening’ in de QR-code is door de GGD versleuteld met hun geheime sleutel. Maar iedereen – in de praktijk: de software van alle scanners en mobieltjes – beschikt over de publieke sleutel om die informatie weer leesbaar te maken.
Als je een QR-code zou maken waar gewoon in klare taal in staat ‘Willem Engel is met Pfizer gevaccineerd op 1 april 2021’ dan zou een corona QR-scanner die proberen te ontcijferen met de publieke sleutel, wat slechts een random letterbrij oplevert. Het feit dat scannen met de publieke sleutel een leesbare handtekening oplevert, bewijst dat deze QR-code alleen opgesteld kan zijn door degene die de geheime sleutel heeft, hier dus de GGD. En dat bewijst dat de QR-code authentiek is.
Dat is omgekeerd aan wat je doet om een boodschap die prive moet blijven te versturen: daar versleutel je je bericht met de publieke sleutel van de geadresseerde, en die ontsleutelt het bericht met haar geheime sleutel.
De toekomst van de QR-code
De hoop was in 2020, dat de snelle zelftests een sensitiviteit van meer dan 80 procent zouden hebben, dus minder dan 20 procent vals-negatieve testuitslagen. In de praktijk blijkt dit eerder 35 procent te zijn. Ook de effectiviteit van de vaccins in het voorkomen van besmetting bleek lager dan gehoopt, met name op een termijn van langer dan 6 maanden.
Dat maakt het hele systeem van selectieve toegang voor mensen met een groen vinkje of een negatieve zelftest minder effectief bij het bestrijden van besmettingen. De hoop was aanvankelijk, dat iemand die met een groen vinkje werd binnengelaten in een restaurant of bij een popconcert, een minstens tien keer zo kleine kans had om besmettelijk te zijn als iemand zonder groen vinkje. In de Delta golf bleek dat door bovengenoemde beperkingen de kans dat iemand toch besmettelijk is, met nog slechts een factor drie verkleinde. En uit het recente onderzoek van de TU Delft blijkt nu, dat de immuniteit-ontwijkende omikron-variant de effectiviteit nog veel verder reduceert. “En dan komt de vraag op, aldus Boncz: “Is zo’n middel nog proportioneel?
Daar zal de komende tijd ongetwijfeld nog heftig over gedebatteerd worden.