Použitie algoritmov na šifrovanie a elektronický podpis údajov
v preukaze študenta

Táto stránka zodpovedá metodickému usmerneniu MŠ č. 16/2014 o preukaze študenta a jeho prílohám. Podrobnosti o usmernení nájdete na stránke Metodické usmernenie o preukaze študenta.

Stránka obsahuje príklad zostavenia dátového záznamu v pamäti preukazu študenta na základe vzorových údajov o fiktívnej osobe (ďalej len "záznam študenta"). Na stránke možno experimentovať s údajmi, čo môže výrazne prispieť k správnemu pochopeniu nového usmernenia.

Projekt vznikol počas prípravy usmernenia a slúžil na praktické overenie navrhovaných princípov a postupov. Vyjadrili sa k nemu zainteresované osoby na vysokých školách a partnerské organizácie, ktoré s preukazmi pracujú na technickej úrovni (Cominfo - Žilinská univerzita, EMtest - autobusová doprava). Môže slúžiť ako referenčný vzor pri implementácii programových nástrojov na prácu s preukazmi. Je vypracovaný v programovacom jazyku C# .NET 4.0 / Visual Studio 2012.

Kryptovacie algoritmy, ktoré sú potrebné na zostavenie a spätné dekódovanie záznamu študenta, sú k dispozícii na programové volanie prostredníctvom webovej služby Crypto.asmx. Ich zoznam nájdete na stránke Crypto.aspx.

Kryptovacie výpočty na tejto stránke sa vykonávajú pomocou internej knižnice webovej aplikácie, lebo sa z nich prezentujú rôzne medzivýsledky. Pomocou webovej služby je implementovaný len porovnávací výpočet záznamu študenta a jeho spätné dekódovanie na konci stránky. Osobitné testovacie stránky jednotlivých algoritmov sú implementované len pomocou webovej služby:  SHA-1, CRC-32, AES-128 a ECDSA P-192.

História zmien na stránkach

  • 2013.11      - prvá verzia stránok k návrhu usmernenia
  • 2014.04.04 - aktualizovaná verzia stránok k finálnemu textu usmernenia
  • 2014.06.01 - je doplnená webová služba na programové volanie kryptovacích algoritmov, na stránkach je doplnená indikácia priebehu kryptovacích výpočtov v pozadí, pre algoritmy ECDSA možno zvoliť použitú knižnicu (BC crypto / Open SSL), je spresnená indikácia chýb vo výpočtoch, je opravená chýba pri použití privátneho kľúča ECDSA s knižnicou BC crypto (niektoré kľúče sa vyhodnocovali nesprávne)

Vysvetlivky k ďalšiemu textu:

  • Modrou farbou sú označené hodnoty bajtov alebo bajtových polí v šestnástkovej číselnej sústave (hexadecimálne, hexa) - napr. 3D 25 F9.
  • Zelenou farbou sú označené číselné údaje v desiatkovej číselnej sústave - napr. 123.
  • Hnedou farbou sú označené znakové reťazce - napr. František.
  • Ak v dátovom poli nie je vyplnená povinná položka, označí sa červenou hviezdičkou, nesprávne vyplnené údaje sa označia červenými otáznikmi.
  • Všetky výpočty a väčšina kontrol vstupných údajov sa vykonáva na webovom serveri, čo môže predĺžiť reakčný čas aplikácie.

Vstupné údaje

K1, K2 - tajné kľúče na šifrovanie a dešifrovanie dátových blokov č. 1 a 2 v pamäti preukazu, ktoré určí ministerstvo podľa čl. 12, ods. 1 usmernenia. Tieto kľúče sú spoločné pre všetkých vydavateľov preukazov a poskytovateľov služieb, ktoré si vyžadujú použitie údajov v pamäti preukazu. Kľúče sú dlhé 16 bajtov.

Privátny a verejný kľúč - slúžia na vytvorenie a overenie elektronického podpisu vydavateľa preukazu.

Šifrovací kľúč K1:       
Šifrovací kľúč K2:       
Privátny kľúč na podpis:         
Verejný kľúč na podpis:       
???
Knižnica na podpis:  

UID - unikátny identifikátor bezkontaktného čipu Mifare v preukaze, ktorý je dlhý 7 bajtov na preukaze s čipom DESFire a 4 bajty na preukaze s čipom Classic. Používa sa na vytvorenie a overenie elektronického podpisu vydavateľa preukazu.

Typ preukazu:   
UID:     
little-endian: 12 34 56 78 9A BC DE

Dátový blok č. 0 - verejné údaje o preukaze, nešifrované

Položka Príklad
1. Druh preukazu:    
2. Začiatok platnosti preukazu:    
3. Koniec platnosti preukazu:    
4. Dátum poslednej aktualizácie údajov:    
1|20130901|20140930|20140324 28  znakov
31 7C 32 30 31 33 30 39 30 31 7C 32 30 31 34 30
39 33 30 7C 32 30 31 34 30 33 32 34 00 00 00 00
28  bajtov + zarovnanie

Podľa čl. 9 usmernenia dátový blok obsahuje súvislý reťazec znakov zostavený z položiek vo formáte CSV s oddeľovacím znakom „|“. Je kódovaný podľa normy UTF-8 a zarovnaný na násobok 16 bajtov.

Dátový blok č. 1 - potvrdenie o štúdiu na vysokej škole, šifrované kľúčom K1

Položka Príklad
1. Škola, fakulta, miesto štúdia - kód:    
2. Škola, fakulta, miesto štúdia - PSČ:    
3. Stupeň štúdia:    
4. Pohlavie:    
5. Tituly pred menom:
6. Meno:  
7. Priezvisko:  
8. Tituly za menom:
710010100|83106|2|M|Bc.|František|Ľúbezný| 42  znakov
37 31 30 30 31 30 31 30 30 7C 38 33 31 30 36 7C
32 7C 4D 7C 42 63 2E 7C 46 72 61 6E 74 69 C5 A1
65 6B 7C C4 BD C3 BA 62 65 7A 6E C3 BD 7C 00 00
00 00 00 00 00 00 00 00 00 00 00 00 FB E9 91 A3
46  bajtov + zarovnanie + CRC
69 92 B0 38 6F C5 03 FE C1 75 6F 5F 45 7B ED 48
C8 B5 B2 83 83 06 0D 63 E5 C2 F9 E6 84 81 0C 22
28 A1 68 9A B1 6E F3 AB 26 CC A9 1E E6 46 2C 5D
2E 93 70 66 FB 01 F1 08 37 6D 4E 8D 7C 47 FA 0E
šifrovaný

Meno študenta v príklade je zvolené tak, aby sa preukázal vplyv kódovania UTF-8 na znaky so slovenskými diakritickými znamienkami. Vďaka tomuto kódovaniu reťazec v binárnej forme zaberá viac bajtov ako obsahuje znakov. Oddeľovač „|“ na konci záznamu je prítomný preto, že posledná položka „Tituly za menom“ je prázdna.

Podľa čl. 9, ods. 5 usmernenia sa šifruje celý dátový blok algoritmom AES-128 s parametrami Mode = CBC, Padding = None, IV = 0. Do posledných 4 bajtov bloku sa predtým vloží kontrolný súčet bloku podľa štandardu Mifare CRC-32.

Dátový blok č. 2 - osobné údaje držiteľa preukazu, šifrované kľúčom K2

Položka Príklad
1. Osobné číslo:  
2. Dátum narodenia:    
3. Trvalý pobyt - ulica a číslo domu:  
4. Trvalý pobyt - obec:  
5. Trvalý pobyt - PSČ:  
6. Trvalý pobyt - štát:    
7. Prechodný pobyt - ulica a číslo domu:  
8. Prechodný pobyt - obec:  
9. Prechodný pobyt - PSČ:  
120735|19950311|M. R. Štefánika 78/A|Čadca|02201|SK|Staré Záhrady 35|Bratislava|82105 85  znakov
31 32 30 37 33 35 7C 31 39 39 35 30 33 31 31 7C
4D 2E 20 52 2E 20 C5 A0 74 65 66 C3 A1 6E 69 6B
61 20 37 38 2F 41 7C C4 8C 61 64 63 61 7C 30 32
32 30 31 7C 53 4B 7C 53 74 61 72 C3 A9 20 5A C3
A1 68 72 61 64 79 20 33 35 7C 42 72 61 74 69 73
6C 61 76 61 7C 38 32 31 30 35 00 00 44 68 90 3C
90  bajtov + zarovnanie + CRC
BE 69 CE 36 CC 33 91 5A 62 A6 3A 88 39 C2 8E AD
BC C3 CB E8 63 BE 1B 4C 32 46 1B BA CD 2A 3D 64
F1 A4 6B 49 73 A2 A9 43 E1 A5 56 7A 75 39 D3 7E
D5 A9 62 F8 F8 92 66 06 4B 6F 8A 29 2D D3 88 F4
E0 B0 BE 42 D1 77 AD 1D D2 2D F9 0A 38 D3 95 1D
7D 34 DE DF 07 6E E1 AA 8B C5 A2 90 09 AD 2B E3
šifrovaný

Elektronický podpis vydavateľa preukazu

Podľa čl. 10 usmernenia elektronický podpis údajov sa vytvára pomocou algoritmov SHA-1 a ECDSA s krivkou NIST P-192, ktorá je známa aj pod označením X9.62 prime192v1 alebo secp192r1. Do jeho výpočtu vstupuje obsah celého záznamu a UID preukazu. Výsledný podpis sa vkladá za posledný dátový blok.

05 01 01 1B 1C 00 2E 00 5A 00 00 00 00 00 00 00 hlavička dátového záznamu (pozri ďalej)
31 7C 32 30 31 33 30 39 30 31 7C 32 30 31 34 30
39 33 30 7C 32 30 31 34 30 33 32 34 00 00 00 00
dátový blok č. 0
69 92 B0 38 6F C5 03 FE C1 75 6F 5F 45 7B ED 48
C8 B5 B2 83 83 06 0D 63 E5 C2 F9 E6 84 81 0C 22
28 A1 68 9A B1 6E F3 AB 26 CC A9 1E E6 46 2C 5D
2E 93 70 66 FB 01 F1 08 37 6D 4E 8D 7C 47 FA 0E
dátový blok č. 1
BE 69 CE 36 CC 33 91 5A 62 A6 3A 88 39 C2 8E AD
BC C3 CB E8 63 BE 1B 4C 32 46 1B BA CD 2A 3D 64
F1 A4 6B 49 73 A2 A9 43 E1 A5 56 7A 75 39 D3 7E
D5 A9 62 F8 F8 92 66 06 4B 6F 8A 29 2D D3 88 F4
E0 B0 BE 42 D1 77 AD 1D D2 2D F9 0A 38 D3 95 1D
7D 34 DE DF 07 6E E1 AA 8B C5 A2 90 09 AD 2B E3
dátový blok č. 2
12 34 56 78 9A BC DE UID preukazu
89 B9 39 82 A2 48 80 BE 40 75 D4 8F 34 00 97 BF
3E 14 82 CD
kontrolný súčet - 20 bajtov
CD D7 01 CC 34 0D 08 C5 12 51 0D 04 A3 A9 5F 4B
A3 90 D4 E2 10 1D F2 9D C8 8A A1 E0 6F DE B2 83
21 A3 32 A9 3A E1 06 E5 AF 14 65 93 D0 16 AB 30
elektronický podpis - 48 bajtov

Podpis tvoria dve veľké celé čísla bez znamienka, ktoré sa v kryptografii ECDSA označujú ako R a S. Každé z nich je dlhé 24 bajtov (192 bitov) a je uložené v tvare "big-endian". Poznamenávame, že pre rovnaké vstupné údaje, t.j. kontrolný súčet a privátny kľuč, algoritmus vygeneruje vždy iný podpis.

Výsledný dátový záznam

Podľa čl. 7 usmernenia dátový záznam tvorí hlavička, tri dátové bloky a elektronický podpis vydavateľa preukazu.

05 - verzia záznamu 16 bajtov - hlavička
01 - verzia kľúča K1
01 - verzia kľúča K2
1B - registračné číslo kľúča elektronického podpisu (príklad)
1C 00 - dĺžka dát v bloku č. 0
2E 00 - dĺžka dát v bloku č. 1
5A 00 - dĺžka dát v bloku č. 2
00 00 00 00 00 00 - zarovnanie
31 7C 32 30 31 33 30 39 30 31 7C 32 30 31 34 30
39 33 30 7C 32 30 31 34 30 33 32 34 00 00 00 00
32  bajtov - dátový blok č. 0
69 92 B0 38 6F C5 03 FE C1 75 6F 5F 45 7B ED 48
C8 B5 B2 83 83 06 0D 63 E5 C2 F9 E6 84 81 0C 22
28 A1 68 9A B1 6E F3 AB 26 CC A9 1E E6 46 2C 5D
2E 93 70 66 FB 01 F1 08 37 6D 4E 8D 7C 47 FA 0E
64  bajtov - dátový blok č. 1
BE 69 CE 36 CC 33 91 5A 62 A6 3A 88 39 C2 8E AD
BC C3 CB E8 63 BE 1B 4C 32 46 1B BA CD 2A 3D 64
F1 A4 6B 49 73 A2 A9 43 E1 A5 56 7A 75 39 D3 7E
D5 A9 62 F8 F8 92 66 06 4B 6F 8A 29 2D D3 88 F4
E0 B0 BE 42 D1 77 AD 1D D2 2D F9 0A 38 D3 95 1D
7D 34 DE DF 07 6E E1 AA 8B C5 A2 90 09 AD 2B E3
96  bajtov - dátový blok č. 2
CD D7 01 CC 34 0D 08 C5 12 51 0D 04 A3 A9 5F 4B
A3 90 D4 E2 10 1D F2 9D C8 8A A1 E0 6F DE B2 83
21 A3 32 A9 3A E1 06 E5 AF 14 65 93 D0 16 AB 30
48  bajtov - elektronický podpis

Celková dĺžka dátového záznamu v tomto prípade je 256  bajtov. Ak by presiahla 480 bajtov, museli by sa skrátiť textové položky v dátových blokoch. Automatické skracovanie textových položiek v tejto ukážke nie je implementované.

Registračné číslo kľúča elektronického podpisu uvedené v hlavičke záznamu slúži na vyhľadanie verejného kľúča vydavateľa preukazu, ktorým možno overiť platnosť podpisu.

Použitie webovej služby na zostavenie a spätnú kontrola dátového záznamu

Vyššie uvedená ukážka zostavenia záznamu študenta je implementovaná pomocou internej knižnice webovej aplikácie. Rovnaké výsledky dostaneme, keď na zostavenie a spätnú kontrolu dátového záznamu použijeme webovú službu Crypto.

Tlačidlom "Zostavenie záznamu" sa zavolá metóda Preukaz_Encode() s rovnakými vstupnými údajmi, aké boli použité vo vyššie uvedenej ukážke. Potom sa skontroluje, či jej výsledkom je rovnaký sled bajtov, ako je uvedené v časti "Výsledný dátový záznam". Odlišný môže byť len elektronický podpis údajov, lebo ten využíva generátor náhodných čísel a vygeneruje sa vždy inak. Ak dátová časť záznamu je zhodná a elektronický podpis údajov je platný, pod tlačidlom sa zobrazí kladný výsledok.

Tlačidlom "Kontrola záznamu" sa zavolá metóda Preukaz_Decode() a odovzdá sa jej vyššie uvedený "Výsledný dátový záznam". Potom sa skontroluje, či výsledkom dekódovania záznamu sú rovnaké znakové reťazce, aké sme použili v dátových blokoch 0, 1 a 2 (platnosť elektronického podpisu údajov skontroluje webová služba). Ak áno, pod tlačidlom sa zobrazí kladný výsledok.


???

???