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.
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.
Dátový blok č. 0 - verejné údaje o preukaze, nešifrované
„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
„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
„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.