Koronavirus | Očkování

V evropském očkovacím QR kódu, který budete ukazovat na dovolené, se skrývá zakódovaný text. Takhle ho přečtete

Na webu ocko.uzis.cz už běží funkční Očkovací portál občana. Zájemci si zde mohou vygenerovat mezinárodní očkovací certifikát, který bude platný v EU. Ministerstvo zdravotnictví zároveň odesílá očkovaným ještě druhý očkovací certifikát na e-mail ve formě šifrované přílohy ZIP, přičemž heslo dorazí v SMS.

V obou certifikátech je QR kód a v tom českém i čárový. Zatímco QR kód v českém očkovacím certifikátu obsahuje standardní webovou adresu, která vede bez potřeby autentizace přímo na vaši webovou kartu očkovaného se všemi myslitelnými detaily, jednodušší evropský certifikát obsahuje hutně zakódovaný text.

Klepněte pro větší obrázekKlepněte pro větší obrázekKlepněte pro větší obrázek
Český certifikát, který ministerstvo zdravotnictví rozesílá v zašifrované poštovní příloze, a ten evropský, který stáhnete z webu ocko.uzis.cz

Je tedy zjevné, že k jeho přečtení se bude používat dedikovaná aplikace nebo čtečka – třeba kdesi na letní dovolené, když vás na hranicích nebo až na místě bude kontrolovat hlídka.

Klepněte pro větší obrázek
Obsah evropského QR kódu představuje změť alfanumerických znaků uvozených identifikátorem HC1 (Health Certificate Version 1)

Jak rozluštit obsah QR v Pythonu

Geekové si nicméně mohou QR rozluštit i svépomocí. Jedná se totiž zakódovaná binární data metodou Base45, dále algoritmem Zlib a nakonec je vše ještě serializované technikou CBOR. Pokud se všemi těmito vrstvami prokoušete, získáte už dobře čitelnou strukturu ve formátu JSON.

Pokud se nebojíte Pythonu, spusťte v něm tento maximálně zjednodušený kód:

import zlib, base45, cbor, pprint
print("Zkopíruj obsah QR kódu: ", end="")
pprint.pprint(cbor.loads(cbor.loads(zlib.decompress(base45.b45decode(input()[4:]))).value[2]))

Pozor, je třeba doinstalovat všechny potřebné balíčky. Především exotičtější base45 a cbor:

pip3 install base45 cbor

Nebo

pip install base45 cbor

Podle konfigurace vašeho systému a Pythonu.

Po spuštění vás stručný skript požádá, abyste do vstupu zkopírovali surový obsah z QR kódu, který jste přečetli v libovolné čtečce. Z těch webových třeba v Zxing.org.

Klepněte pro větší obrázek
Spuštění kódu výše v Pythonu3

JSON struktura obsahuje položky, které najdete i na evropském certifikátu. Z těch snadno identifikovatelných:

  • dob: datum narození
  • fn: příjmení s diakritikou
  • fnt: příjmení bez diakritiky
  • gn: jméno s diakritikou
  • gnt: jméno bez diakritiky
  • ci: identifikátor
  • co: zkratka země (CZ)
  • dn:  pořadové číslo dávky
  • dt: datum očkování
  • is: vydavatel (ministerstvo zdravotnictví)
  • mp: evropská registrace očkovací látky:
    • EU/1/20/1528 = Comirnaty
    • EU/1/20/1507 = Moderna
    • EU/1/21/1529 = AstraZeneca
    • EU/1/20/1525 = Janssen
  • sd: počet dávek
  • tg: kód nemoci/agensu (840539006)
  • vp: kód vakcíny (Comirnaty má 1119349007)

Na konci struktury je ještě časový údaj roční platnosti a vygenerování QR kódu ve formátu Unix timestamp, tedy jako počet sekund od unixové epochy. Jsou to ta dvě čísla začínající 16:

 1: 'CZ',
 4: 1654032850,
 6: 1622496850}

Pro ověření je můžete zkopírovat třeba do formuláře na webu unixtimestamp.com a převést na srozumitelné datum a čas. 

O dalších technických detailech se na Twitteru a v češtině rozepsal třeba Radek Zajíc:

Diskuze (97) Další článek: Proč proboha někdo používá Průzkumník? Jak může někdo používat Total Commander? Ještě jedna anketa…

Témata článku: Koronavirus, Programování, Twitter, Očkování, Python, COVID-19, Evropská unie, Kód, SMS, Moderna, Obsah, AstraZeneca, Certifikát, Bash, QR kód, Janssen, JSON, Dovolená, Value, Diakritika, Comirnaty