Kriptográfia és Információbiztonság 2. előadás Sapientia Egyetem, Matematika-Informatika Tanszék Marosvásárhely, Románia mgyongyi@ms.sapientia.ro 2018
Miről volt szó az elmúlt előadáson? Követelmények, osztályozás Bevezető, félévi áttekintő Könyvészet Történelmi háttér Klasszikus kriptográfiai rendszerek: Eltolásos rejtjelezések: Caesar-titkosító, Keyword Caesar Helyettesítéses rejtjelezés: affin-titkosító
Miről lesz szó? Klasszikus kriptográfiai rendszerek Helyettesítéses rejtjelezés: affin-titkosító Mátrixos rejtjelezés: Hill módszere matematikai modell titkos-kulcsú rendszerek: matematikai modell az OTP titkosítási rendszer tökéletes biztonság biztonság-értelmezések, osztályozások az NTL könyvtárcsomag Mátrix műveletek Javában
Az Affin rejtjelezés helyettesítéses, monoalfabetikus rejtjelezés, M = C = {0, 1,..., 25} = Z 26, K = {(a, b) Z 26, gcd(a, 26) = 1}, key = (a, b) Enc(m) = (a m + b) (mod 26) c, Dec(c) = a1 (c + 26 b) (mod 26). Megjegyzés: 1 a1, az a multiplikatív inverze (mod 26) szerint, ami azt jelenti, hogy meg kell határozni azt az a1 értéket, amelyre fennáll: a a1 = 1 (mod 26). Feltörési módszerek: 1 gyakoriság vizsgálat 2 az összes lehetséges kulcs kipróbálása, kulcsok száma: 312 3 ismert nyílt-szöveg támadás: ha rendelkezünk két betű rejtjelezett értékével
Az Affin rejtjelezés - példa Ha a kulcs (5, 2) és a nyílt-szöveg a következő: akkor a titkosított-szöveg: AMATHEMATICIAN, CKCTLWKCTQMQCP, ahol a titkosított-szöveg első 6 karakterét a következőképpen határoztuk meg: A > C : (5 0 + 2) = 2 (mod 26) M > K : (5 12 + 2) = 10 (mod 26) A > C : (5 0 + 2) = 2 (mod 26) T > T : (5 19 + 2) = 19 (mod 26) H > L : (5 7 + 2) = 11 (mod 26) E > W : (5 4 + 2) = 22 (mod 26) A visszafejtéshez szükséges kulcs: (21, 2), mert 5 21 = 105 = 1 (mod 26), azaz, 5 multiplikatív inverze (mod 26) szerint 21.
Az Affin rejtjelezés - ismert nyílt-szöveg támadás Ha ismertek az m 1, m 2, c 1, c 2, akkor a következő kongruencia-rendszer megoldásával, megállapítható a titkosításhoz használt (a, b) kulcs: m 1 a + b = c 1 (mod 26) m 2 a + b = c 2 (mod 26). (m 1 m 2 ) a = (c 1 c 2 ) (mod 26) a = (m 1 m 2 ) 1 (c 1 c 2 ) (mod 26) b = (c 1 m 1 a) (mod 26) vagy b = (c 2 m 2 a) (mod 26) Ha létezik multiplikatív inverz, akkor az meghatározható : a kiterjesztett Eukleidészi algoritmussal, az összes érték kipróbálásával (26 szorzás szükséges).
Hill módszere, példa, titkosítás 1929-ben publikálta Lester S. Hill, polialfabetikus rendszer, az első blokk titkosítók egyike. Legyen d = 2, az egyszerre titkosítható szimbólumok száma, M = C = Z 2 26, és ( ) 3 3 key =, 2 1 ha a nyílt szöveg: AM AT HE MA TI CI AN, akkor a titkosított szöveg: KM FT HQ KC DW EE NN, az első két betű-tömb titkosítása: ( ) ( ) ( 3 3 A 3 3 = 2 1 M 2 1 ( 3 3 2 1 ) ( A T ) ( 3 3 = 2 1 ) ( 0 12 ) ( 0 19 ) ( 10 = 12 ) ( 5 = 19 ) ( K = M ) ( F = T ), ).
Hill módszere, példa, visszafejtés a visszafejtéshez meg kell határoznunk a kulcs inverz értékét, azaz a determináns, majd az inverz mátrix értékét. ( ) 3 3 key = esetében (det key) = 1 3 ( 2) 3 = 9, 2 1 gcd(9, 26) = 1 (det key)-nek létezik inverze, ahol (det key) 1 = 3, mert 9 3 = 1 (mod 26). ( ) 1 3 az adjungált mátrix: (adj key) =. 2 3 az inverz mátrix: key 1 = (det key) 1 (adj key) = 3 az első két betű-tömb visszafejtése: ( ) ( ) ( 3 9 K 3 9 = 6 9 M 6 9 ( 3 9 6 9 ) ( F T ) ( 3 9 = 6 9 ( 1 3 2 3 ) ( 10 12 ) ( 5 19 ) ( 3 9 = 6 9 ) ( 0 = 12 ) ( 0 = 19 ). ) ( A = M ) ( A = T ), ).
Hill módszere, általános esetben M = C = Z d 256, a key egy d d-es mátrix, melynek elemei Z 256, jelöljük a mátrix i, j elemét k i,j -vel, legyen m = (m 1, m 2,... m d ) M a nyílt szöveg egy d hosszúságú blokkja, melyet egy lépésben fogunk titkosítani, a titkosítás során meghatározzuk a nyílt szöveg egy lineáris transzformációját: c = (c 1, c 2,... c d )-t, a mátrix műveletekkel kapcsolatos algoritmusok implementációja: NTL könyvtárcsomagban (C/C++).
Hill módszere Enc key (m) : c = key m (c 1, c 2,... c d ) = k 1,1 k 1,2... k 1,d k 2,1 k 2,2... k 2,d... k d,1 k d,2... k d,d m 1 m 2. m d Dec key (c) = key 1 c key 1 létezik, ha (det key) (det key) 1 = 1 (mod 256), key 1 = (det key) 1 (adj key) (mod 256), ahol (adj key) az adjungált mátrix. ha d = 2, akkor egyszerűen meghatározható az inverz mátrix ( ) ( ) k1,1 k key = 1,2 és key k 2,1 k 1 = (det key) 1 k2,2 k 1,2 2,2 k 2,1 k 1,1 általános esetben több algoritmus is létezik C++ alatt lehet használni Shoup NTL könyvtárcsomagját
Hill módszere - ismert nyílt-szöveg támadás, d = 2 Ha ismertek az m, ˆm, c, ĉ, tömb-párok értékei, ahol az m rejtjelezett értéke c és az ˆm rejtjelezett értéke ĉ, akkor a következő rendszer megoldásával, megállapítható a titkosításhoz használt key kulcs, ( ) ( ) ( ) ( ) m1 c1 ˆm1 ĉ1 legyen m =, c =, ˆm =, ĉ =, m 2 c 2 ˆm 2 ĉ 2 feĺırható: ( ) ( ) m1 ˆm key 1 c1 ĉ = 1 m 2 ˆm 2 c 2 ĉ 2 ( ) ( ) 1 c1 ĉ key = 1 m1 ˆm 1 c 2 ĉ 2 m 2 ˆm 2 hasonló támadási stratégia alkalmazható nagyobb blokk méret esetében.
A klasszikus titkosítás matematikai modellje Legyen M a nyílt-szövegek egy véges halmaza, C a rejtjelezett-szövegek egy véges halmaza, K a kulcsok egy véges halmaza. Három algoritmust értelmezünk: Gen, a kulcs-generáló algoritmus, meghatározza a key kulcsot, Enc key a rejtjelező algoritmus, a key kulcs alapján, meghatározza az m M nyílt-szöveg rejtjelezett értékét: c Enc key (m), Dec key a visszafejtő algoritmus, a key kulcs alapján visszafejti a c rejtjelezett-szöveget: m Dec key (c). A rendszer helyessége érdekében megköveteljük: Dec key (Enc key (m)) = m, minden m M esetében. Számos klasszikus titkosítási rendszer létezik: Caesar, Vigenere, Palyfair, Hill, stb.
A titkos-kulcsú rendszerek matematikai modellje megnevezések: titkos-kulcsú rendszerek, szimmetrikus rendszerek (private-key, symmetric crypto), jelölés: SKE-vel, a (K, M, C) halmaz-hármas felett értelmezzük. 3 algoritmus: Gen, a kulcs-generáló algoritmus, polinom idejű, véletlenszerű: key R Gen(1 k ), ahol key K, k Z 0 a rendszer biztonsági paramétere (legtöbb esetben a generált kulcs bit-hossza), Enc key a rejtjelező algoritmus, polinom idejű, véletlenszerű: c R Enc key (m), a Dec key a visszafejtő algoritmus, polinom idejű, determinisztikus: m Dec key (c). Helyesség: Dec key (Enc key (m)) = m, minden m M esetében. gyakorlatban a polinom futásidejű algoritmus hatékony algoritmust jelent, például elvárjuk, hogy 1 gigabájtnyi adat titkosítását 1 perc alatt végezze el a rendszer
Az OTP rendszer A továbbiakban olyan rendszereket tárgyalunk, amelyek biztonsága, számítástechnikai szempontból elfogadható. OTP - One-time Pad rendszer, 1917, Vernam rendszerének egy változata, M = C = K = Z k 2, legyen m = (m 1,..., m k ) M, c = (c 1,..., c k ) C, key = (key 1,..., key k ) K, Gen R key, (véletlenszerűen, egyenletes eloszlással) Enc key (m) : c = (m 1 key 1,... m k key k ), Dec key (c) : m = (c 1 key 1,... c k key k ). helyesség: Dec key (Enc key (m)) = Dec key (m key) = (m key) key = m.
Az OTP rendszer Példa, titkosításra, ahol a kulcs és a nyílt szöveg is 7 bites: m = (1 1 0 0 1 0 0) key = (0 0 1 0 1 0 1) c = (1 1 1 0 0 0 1) Példa, visszafejtésre, ahol a kulcs és a rejtjelezett szöveg is 7 bites: c = (1 1 1 0 0 0 1) key = (0 0 1 0 1 0 1) m = (1 1 0 0 1 0 0)
Az OTP rendszer, feltörési lehetőségek A kulcs többszöri felhasználásának problémája: m 1 = (1 1 0 0 1 0 0) key = (0 0 1 0 1 0 1) c 1 = (1 1 1 0 0 0 1) m 2 = (1 0 0 1 1 1 0) key = (0 0 1 0 1 0 1) c 2 = (1 0 1 1 0 1 1) m 2, c 2 ismeretében meg lehet határozni a key értékét, majd a key és a c 1 alapján meg lehet határozni m 1-t: m 2 = (1 0 0 1 1 1 0) c 2 = (1 0 1 1 0 1 1) key = (0 0 1 0 1 0 1) key = (0 0 1 0 1 0 1) c 1 = (1 1 1 0 0 0 1) m 1 = (1 1 0 0 1 0 0)
Az OTP rendszer, feltörési lehetőségek A kulcs többszöri felhasználásának problémája: m 1 = (1 1 0 0 1 0 0) key = (0 0 1 0 1 0 1) c 1 = (1 1 1 0 0 0 1) m 2 = (1 0 0 1 1 1 0) key = (0 0 1 0 1 0 1) c 2 = (1 0 1 1 0 1 1) c 1, c 2 ismeretében meg lehet határozni m 1 m 2 értékét: c 1 = (1 1 1 0 0 0 1) c 2 = (1 0 1 1 0 1 1) m 1 m 2 = (0 1 0 1 0 1 0)
Tökéletes biztonság 1. tétel Shannon biztonság-elmélete, 1949 információelméleti biztonság, Egy Gen, Enc, Dec algoritmusok által értelmezett titkosító rendszer tökéletesen biztonságos (perfectly secret), ha M bármely valószínűség eloszlása esetében és bármely m M, c C esetében, fenn áll: ahol Pr[C = c] > 0. Pr[M = m C = c] = Pr[M = m], Több, a fentivel ekvivalens definíció létezik.
Az OTP rendszer 2. tétel Az OTP titkosító rendszer tökéletes biztonságú. Megjegyzések: nagyon gyors a titkosítás és visszafejtés folyamata, nem lehet észrevenni, ha módosult a rejtjelezett-szöveg üzenet-hitelesítő kódok, a generált kulcsot tilos többször felhasználni: ha ismert egy nyílt-szöveg és titkosított szöveg pár, akkor meglehet határozni a kulcsot, minden egyes titkosításhoz más kulcsot használunk, mely független a korábbi kulcsoktól, a generált kulcs ugyanolyan hosszú kell legyen, mint a nyílt szöveg.
Biztonság-értelmezések 3. tétel Ha egy titkosító rendszer tökéletes biztonságú, akkor K M. A tétel azt jelenti, hogy nehéz gyakorlatilag olyan titkosító rendszert létrehozni, mely tökéletes biztonságú. Más biztonság-értelmezések számítástechnikai biztonság, feladja a tökéletes biztonságot, feltételezi, hogy: a támadó számítás-kapacitása (idő, tár) korlátos, a támadás csak nagyon kicsi valószínűséggel lehet sikeres.
A titkos-kulcsú rendszerek osztályozása nagy adathalmaz titkosítására alkalmasak, nincs megoldva a felek közötti kulcs-csere, ezt a nyilvános kulcsú kriptográfia végzi, két nagy csoportra oszthatóak: folyam-titkosító rendszerek, blokk-titkosító rendszerek.
Folyam-titkosító rendszerek véletlenszerűen generálnak egy bitsort, a kulcsfolyamot, amelyet legtöbbször a művelettel hozzáadnak a nyílt szöveghez, a kulcsfolyamot egyetlenegyszer használják, a rendszer biztonságát a kulcsfolyamot generáló algoritmus határozza meg álvéletlen-szám generáló algoritmusok (pseudo-random number generators), nem minden ál-véletlenszám generátor alkalmas a kriptográfiában, pl: az x n = a x n 1 + b (mod p) lineáris kongruenciával értelmezett generátor sem alkalmas.
Blokk-titkosító rendszerek bájt-tömbönként alkalmaznak egy álvéletlen függvényt/permutációt, a kulcsot bájt-tömbönként újra használják blokk titkosítási módok, a rendszer biztonságát az alkalmazott álvéletlen függvény (pseudo-random function), illetve álvéletlen permutáció (pseudo-random permutation) határozza meg, egy blokktitkosító rendszer átalakítható folyamtitkosító rendszerré, ha valamilyen blokk-titkosító módot használunk, pl. CFB, CTR.
Az NTL könyvtárcsomag, létrehozás, Visual Studio töltsük le és csomagoljuk ki a, pl. a WinNTL mappába: http://www.shoup.net/ntl/download.html hozzunk létre egy új projektet: New Project Win32 Project, adjunk egy nevet a projektnek, legyen ez NTLLib, jelöljük be a Static library opciót. ne legyenek bejelölve a Precompiled header se a Security Development Lifecycle (SDL) checks opciók, a Source Files-hoz az Add Existing Item menüpont segítségével adjuk hozzá a WinNTL\src mappából az összes állományt, a Project/NTLLib/Properties menüpontnál az Additional Include Directories-nél adjuk meg a header állományok elérési útvonalát:... \WinNTL\include a Build\Bulid\Solution parancs megadásával létrejön a NTLLib\Debug mappában az NTLLib.libállomány, amit a további projekteknél kell használni.
Az NTL könyvtárcsomag, használat, Visual Studio Hozzunk létre egy új projektet: New Project Win32 ConsoleApplication, adjunk egy nevet a projektnek, legyen ez Labor6, jelöljük be a Empty project opciót. a Labor6 project-hez az Add Existing Item menüpont segítségével adjuk hozzá az NTLLib Debug mappából az NTLLib.libállományt, a Project/NTLLib/Properties menüpontnál az Additional Include Directories-nél adjuk meg a header állományok elérési útvonalát:...\winntl\include.
Az NTL könyvtárcsomag, létrehozás, Code Blocks töltsük le és csomagoljuk ki a, pl. a WinNTL mappába: http://www.shoup.net/ntl/download.html hozzunk létre egy új projektet: New Project Static library, adjunk egy nevet a projektnek, legyen ez NTLLib, az Add Files-al adjuk hozzá a WinNTL\src mappából az összes állományt, a Project/Build Options/search Directories menüpontnál az adjuk meg a header állományok elérési útvonalát:... \WinNTL\include a Build\Bulid parancs megadásával létrejön a NTLLib mappában libntlib.a állomány, ezt kell hozzáadni azokhoz a projektekhez, ahol használni akarjuk a az NTL függvényeket.
Az NTL könyvtárcsomag, használat, Code Blocks Hozzunk létre egy új projektet: File New Console Application, adjunk egy nevet a projektnek, legyen ez Labor, a Project\Build Options\Linker settings menüpont segítségével adjuk hozzá az NTLLib mappából a létrehozott *.a állományt, a Project\Build Options\Serach directories-nál adjuk meg a header állományok elérési útvonalát:...\winntl\include.
Az NTL könyvtárcsomag, használat a forráskódba: #ifndef _ZZ_ #define _ZZ_ #include <NTL/ZZ.h> #include <NTL/matrix.h> #include <NTL/mat_ZZ.h> #endif NTL_CLIENT ZZ d; a nagy számok kezelésére szolgáló típus, Mat<ZZ> A; mátrix kezelésére alkalmas típus, A.SetDims(n, n); az A mátrix méretének a beálĺıtása, A.NumRows(); sorméret lekérdezés, A.NumCols(); oszlopméret lekérdezés, inv(d, inva, A, 0); meghatározza az A mátrix determinánsát, a d változóba illetve azt az inva mátrixot, amelyre teljesül: (A * inva) / d = I