Kriptográfia és Információbiztonság 5. előadás Sapientia Egyetem, Műszaki és Humántudományok Tanszék Marosvásárhely, Románia mgyongyi@ms.sapientia.ro 2015
Miről volt szó az elmúlt előadáson? AES (Advanced Encryption Standard) kör-kulcs generálás, titkosítás, visszafejtés, implementáció.
Miről lesz szó? A Crypto++ könyvtárcsomag Az NTL könyvtárcsomag Nagyszámok kezelése C# Nagyszámok kezelése Java Nyilvános-kulcsú, aszimmetrikus (public-key, asymmetric cryptography) rendszerek: alapfogalmak, követelmények, matematikai modell. Az RSA titkosító rendszer: specifikáció, példa, helyesség, A Fermat-féle faktorizációs módszer
A Crypto++ könyvtárcsomag Kriptográfiai sémák, a NIST által elfogadott standard implementációkkal, http://www.cryptopp.com/\#download letöltés, kicsomagolás, projekt létrehozás, build-elés statikus, dinamikus könyvtárak létrehozása, a statikus könyvtár a cryptest solution build-elésekor jön létre, a \cryptopp\win32\output\debug mappába: cryptlib.lib,
A Crypto++ könyvtárcsomag Beálĺıtások: Project/Properties/Configuration Properties/C/C++/Code generation/runtime Library Multi-threaded Debug (/MTd)-ra álĺıtani, Project/Properties/Configuration Properties/C/C++/General/ \cryptopp, a cryptlib.lib-et hozzáadni a projekthez, az alkalmazás elejére beírni: #define CRYPTOPP DEFAULT NO DLL #include "dll.h"
Nagy számok kezelése, C++ Victor Shoup: NTL könyvtárcsomag, a statikus könyvtár létrehozása 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 ConsoleApplication, adjunk egy nevet a projektnek, legyen ez NTLLib, jelöljük be a Static library opciót. ne legyen bejelölve a Precompiled header opció, 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 a statikus könyvtár.
Az NTL könyvtárcsomag, használat Hozzunk létre egy új projektet: New Project Win32 Console Application, 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 a létrehozott statikus könyvtárat, 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, használat a forráskódba: #ifndef _ZZ_ #define _ZZ_ #include <NTL/ZZ.h> #endif NTL_CLIENT ZZ a nagy számok kezelésére szolgáló típus, to_zz string átalakítása ZZ típusá, InvMod multiplikatív inverz meghatározása, XGCD kiterjesztett Euklideszi algoritmus, PowerMod moduláris hatványozás, ZZFromBytes, BytesFromZZ, byte szekvenciából készít ZZ típusú nagyszámot, és fordítva, log logaritmus meghatározása.
Nagy számok kezelése, Java import java.math.biginteger; változó deklarálás: BigInteger n = new BigInteger("101020229"); logaritmus számítás: ln moduláris hatványozás: modpow multiplikatív inverz: modinverse...
Nagy számok kezelése, C# using System.Numerics; változó deklarálás: BigInteger p = 0, q = 0; BigInteger number1 = BigInteger.Parse("7458753872387"); logaritmus számítás: BigInteger.Log(), hatványozás: BigInteger.Pow(), moduláris hatványozás: BigInteger.ModPow(),...
A nyilvános-kulcsú rendszerek, alapfogalmak A titkosítás és visszafejtés nem ugyanazzal a kulccsal történik: van egy titkos-kulcs és van egy nyilvános-kulcs, nem helyettesíti a szimmetrikus kriptográfiát, a rendszerek biztonsága matematikai problémákon alapszanak; az alapműveletek nem a helyettesítés és permutáció, alkalmas bizalmas információcserére és hitelesítésre, illetve mindkettőre; kulcscsere és digitális aláírás protokollokban használják.
A nyilvános-kulcsú rendszerek, követelmények Hatékony algoritmussal lehessen meghatározni a rendszerben használt kulcspárt: a nyilvános és titkos-kulcsot, a nyilvános-kulcs ismeretében, hatékony algoritmussal lehessen meghatározni az üzenet rejtjelezett értékét, a titkos-kulcs ismeretében, hatékony algoritmussal lehessen visszafejteni a rejtjelezett üzenetet, a nyilvános-kulcs ismeretében ne lehessen hatékonyan meghatározni a titkos-kulcsot, a nyilvános-kulcs és rejtjelezett-szöveg ismeretében ne lehessen hatékonyan meghatározni az üzenetet, ne lehessen következtetni annak tartalmára. Kevés olyan rendszert sikerült kidolgozni, amely eleget tesz a fenti követelményeknek (kudarcos próbálkozások: a hátizsák feladaton alapuló titkosító rendszer).
A legismertebb publikus-kulcsú rendszerek RSA (Rivest-Shamir-Adleman), biztonsága azon alapszik, hogy nehéz meghatározni valamely összetett szám prímosztóit, Diffie-Hellman kulcscsere, biztonsága a diszkrét logaritmus probléma nehézségén alapszik, ElGamal titkosító, a Diffie-Hellman kulcscserével áll szoros kapcsolatban, elliptikus görbén alapuló kriptográfia.
A titkos-kulcsú rendszerek matematikai modellje jelölés: SKE, ahol a (K, M, C) halmaz-hármas felett értelmezünk 3 algoritmust: 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.
A nyilvános-kulcsú rendszerek matematikai modellje jelölés: PKE, ahol a (K, M, C) halmaz-hármas felett értelmezünk 3 algoritmus: Gen, a kulcs-generáló algoritmus, polinom idejű, véletlenszerű: (pk, sk) R Gen(1 k ), ahol (pk, sk) K K, k Z 0 a rendszer biztonsági paramétere, Enc pk a rejtjelező algoritmus, polinom idejű, véletlenszerű: c R Enc pk (m), a Dec sk a visszafejtő algoritmus, polinom idejű, determinisztikus: m Dec sk (c). Helyesség: Dec sk (Enc pk (m)) = m, minden m M esetében.
Az RSA titkosító rendszer, kulcsgenerálás Bemenet: a k biztonsági paraméter. Kimenet: a pk = (n, e) nyilvános-kulcs és az sk = d titkos-kulcs. rsakeygen (k) p = primszam(k); q = primszam(k); n = p * q; phi = (p-1) * (q-1); e = rand(phi); d = inverz(e, pi); return n, e, d;
Az RSA titkosító rendszer, kulcsgenerálás a primszam(k) algoritmus generál egy k bit hosszúságú prímszámot, erre leggyakrabban a Miller-Rabin algoritmust használják, lásd később, a jelenlegi standard a k = 1024 értéket ajánlja, amely kb. 308 decimális számjegyet jelent, a rand(phi) algoritmus egy véletlen számot generál, ahol phi az Euler féle függvény, a következő tulajdonsággal 1 < e < phi, gcd(e, phi) = 1. az inverz(e, phi) algoritmus meghatározza d-t a következő tulajdonsággal: e d = 1 (mod phi), erre a kiterjesztett Euklideszi algoritmust kell használni, nem működik az Affinnál és Hillnél használt, összes lehetséges érték kipróbálásának, módszere.
Példa, kulcsgenerálás p, q két prímszám: Legyen p = 3877, q = 1867. Meghatározzuk: n = 3877 1867 = 7 238 359, phi = (p 1) (q 1) = 3876 1866 = 7 232 616. Legyen e = 65 537, ahol gcd(65 537, phi) = 1. Meghatározzuk e inverzét (mod phi) szerint, kapjuk: d = 1 332 809, mert 65 537 1 332 809 = 1 (mod 7 232 616). A nyilvános-kulcs : (65 537, 7 238 359). A titkos-kulcs : (1 332 809).
Az RSA titkosító rendszer, titkosítás Bemenet: az üzenet, mint egy m egész szám a [0,..., n 1] intervallumból, az e, n nyilvános-kulcs. Kimenet: a c titkosított szám rsaencrypt (m, e, n) c = modpow(m, e, n); return c; Az üzenetet(byte-szekvenciát, vagy szöveget) át kell alakítani számmá, lásd később. A modpow(m, e, n) algoritmus meghatározza az m e (mod n) értéket.
Az RSA titkosító rendszer, visszafejtés Bemenet: a c titkosított szám, d titkos-kulcs. Kimenet: az m visszafejtett érték. rsadecrypt (c, d, n) m = modpow(c, d, n); return m; Az m értéket vissza kell alakítani byte szekvenciává, szöveggé, lásd később. A modpow(c, d, n) algoritmus meghatározza a c d (mod n) értéket.
Az RSA titkosító rendszer, helyesség e d = 1 (mod phi) létezik x, egész szám, úgy hogy feltéve hogy: gcd(m, p) = 1 hasonlóan: e d = 1 + x phi. m p 1 = 1 (mod p) m 1+x (p 1) (q 1) = m (mod p) m e d = m (mod p). m e d = m (mod q) m e d = m (mod n).
Példa, titkosítás Legyen az üzenet MATHEMATICIAN, és a kulcsok a kulcsgenerálásnál megadott értékek. Feltélezzük, hogy az alkalmazott ábécé az angol ábécé 26 nagybetűje. A szokásos módon hozzárendeljük a karakterekhez a számkódokat: 12 0 19 7 4 12 0 19 8 2 8 0 13, a karaktersorozatot 26-os számrendszerbeli számnak fogjuk tekinteni, a számokat átírjuk 26 l számrendszerbe, ahol l = log 26 n és n = 7 238 359 l = 4, 4-es csoportokat formálunk, és 26 4 számrendszerben a következő számjegyeket kapjuk: 135 888 334 260 5468 13, mert
Példa, titkosítás 135 888 = 7 26 3 + 19 26 2 + 0 26 1 + 12 26 0 334 260 = 19 26 3 + 0 26 2 + 12 26 1 + 4 26 0 5468 = 0 26 3 + 8 26 2 + 2 26 1 + 8 26 0 13 = 0 26 3 + 0 26 2 + 0 26 1 + 13 26 0. mindegyik számjegyet titkosítjuk a nyilvános-kulccsal: (65 537, 7 238 359), az eredmény: 1 754 108 6 489 950 362 358 5 018 067, a kapott számokat 26 l+1 = 26 5 -beli számoknak tekintjük és átírjuk 26-os számrendszerbe, 5-ös csoportokat formáltunk, az eredmény: 18 21 20 21 3 12 13 6 5 14 22 0 16 20 0 15 4 13 25 10, ahol
Példa, titkosítás 1 754 108 = 3 26 4 + 21 26 3 + 20 26 2 + 21 26 1 + 18 26 0 6 489 950 = 14 26 4 + 5 26 3 + 6 26 2 + 13 26 1 + 12 26 0 362 358 = 0 26 4 + 20 26 3 + 16 26 2 + 0 26 1 + 22 26 0 5 018 067 = 10 26 4 + 25 26 3 + 13 26 2 + 4 26 1 + 15 26 0. A titkosított karaktersorozat: SVUVDMNGFOWAQUAPENZK.
Példa, visszafejtés a titkosított számkód-sorozat: 18 21 20 21 3 12 13 6 5 14 22 0 16 20 0 15 4 13 25 10. a számkódokat átírjuk 26 5 -es számrendszerbe. Az eredmény: 1 754 108 6 489 950 362 358 5 018 067. Mindegyik számra külön alkalmazzuk a titkos-kulcsot: (1 332 809) c 1 754 108 6 489 950 362 358 5 018 067 c 1 332 809 (mod 7 238 359) 135 888 334 260 5468 13 a kapott számokat átírjuk 26-os számrendszerbe, megkapva a visszafejtett számkód-sorozatot: behelyettesítve: MATHEMATICIAN. 12 0 19 7 4 12 0 19 8 2 8 0 13.
Az RSA titkosító rendszer Ha a titkosítást bájtok felett végezzük, akkor a bájtokat 256-os számrendszerbeli számoknak tekintjük egyszerre l bájtot dolgozunk fel, úgy hogy a számokat átírjuk 256 l számrendszerbe, ahol l = log 256 n, majd a kapott nagy számot hatványozzuk, hatványozás után, a kapott értéket 256 l+1 -os számrendszerbeli számnak tekintjük, amelyet átalakítunk 256-os számrendszerbe, kapunk l + 1 bájtot. Visszafejtéskor fordítva járunk el, l + 1 bájtot dolgozunk fel egyszerre, amiből l bájtot kapunk vissza.
Faktorizációhoz kapcsolódó problémák osztási próba módszere (trial division), Fermat-féle faktorizációs módszer, Pollard ρ féle faktorizációs módszer... Az osztási próba módszere: vizsgáljuk a kis prímekkel való oszthatóságot, ha két azonos nagyságrendű prímszám szorzata a vizsgált n összetett szám, akkora közeĺıtőleg n osztást kell kipróbálnunk a sikeres faktorizáláshoz, akkor használjuk, mikor egy összetett szám kis nagyságrendű prímosztóit kell megkeresni.
Fermat-féle faktorizációs módszer Ha a p és a q prímek közel vannak egymáshoz, akkor az n faktorizálása lehetséges a Fermat-féle faktorizációs módszerrel. Feltételezzük, hogy az n = a 2 b 2, ahol a, b tetszőleges egész számok. Ekkor p = a b, q = a + b. Az algoritmus a következő: fermatfaktor(n) a = ceil(sqrt(n)); b1 = a * a - n; while (negyzetsz(b1) == 0) do a = a + 1; b1 = a * a - n; return (a + sqrt(b1)); A negyzetsz függvény megvizsgálja, hogy a paraméterként kapott szám négyzetszám-e, 0-t térít vissza, ha a paramétere nem négyzetszám.
Fermat-féle faktorizáció, példa Határozzuk meg n = 6283 két prímosztóját, a Fermat-féle faktorizációs módszerrel: n a b = a 2 n négyzetszám-e? 80 80 117 nem 81 278 nem 82 441 igen 441 = 21 p = 82 21 = 61, q = 82 + 21 = 103