Kriptográfia és Információbiztonság 7. 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? Kriptográfiai könyvtárcsomagok: a Crypto++ könyvtárcsomag, C++ projektekhez a security csomag és a Cipher osztály Java projektekhez kripto modul a Python projektekhez a OpenSSL könyvtárcsomag Nagy számok kezelés különböző programozási nyelvekben: C++, C#, 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
Miről lesz szó? Az RSA titkosító rendszer (baby, textbook változat): specifikáció, példa RSA, biztonsági problémák RSA a gyakorlatban Az RSA-OAEP rendszer Valószínűségi prímtesztek Az RSA gyorsítása
Az RSA titkosító rendszer RSA (Rivest, Shamir, Adleman), 1976-ban publikálták, aszimmetrikus titkosító az RSA-OAEP (Bellare, Rogaway) verziót 1995-ben publikálták, mai napig standard a titkosítás és visszafejtés nem ugyanazzal a kulccsal történik: van egy privát-kulcs és van egy publikus-kulcs a publikus-kulccsal titkosítunk, a privát-kulccsal fejtjük vissza az üzenetet a publikus-kulcs ismeretében, ha ez megfelelő bit-méretű (> 1024), nem tudjuk meghatározni a privát-kulcsot
Az RSA titkosító rendszer Khan-academy - videó anyag! hatékony algoritmussal ki lehet generálni a kulcsokat a titkosító algoritmus nagy számok titkosítására képes, a kulcsok is nagy számok lesznek a szöveget (bájt-szekvenciát), amit titkosítani akarunk át kell alakítani számmá a titkosított számot vissza kell alakítani szöveggé (bájt-szekvenciává) legyen egy szöveg, 16-os számrendszerben: 0x3f 0xa9 0x4b 0xd2 0xb8 a szöveghez tartozó szám: 63 256 0 + 169 256 1 + 75 256 2 + 210 256 3 + 184 256 4 = 793802156351
Az RSA algoritmus, - baby változat választunk két prímszámot, legyenek ezek: p, q, majd meghatározzuk n = p q kiszámoljuk: phi = (p 1) (q 1), majd kiválasztjuk azt a legkisebb e számot, amelynek nincs közös osztója phi-vel meghatározzuk azt a d számot, amelyre teljesül: e d = 1 (mod phi) a titkosításnál az (e, n) értékpárt használjuk, a visszafejtésnél a (d, n)-t ha az m számot szeretnék titkosítani, akkor kiszámoljuk: m e ahol a kapott értéket jelöljük c-vel (mod n), ha a c számot szeretnék visszafejteni, akkor kiszámoljuk: c d (mod n), ha helyesen számoltunk, akkor visszakapjuk m-t.
Példa, kulcsgenerálás - baby változat legyenek: p = 2997892741, q = 3583389067, 32 bites prímszámok meghatározzuk: n = 2997892741 3583389067 = 10742616072138062647, φ = (p 1) (q 1) = 2997892740 3583389066 = 10742616065556780840. legyen e = 7, ahol lnko(7, φ) = 1. meghatározzuk: d = 9207956627620097863, ahol fennáll: 5 9207956627620097863 = 1 (mod 10742616065556780840). A publikus-kulcs : (7, 10742616072138062647). A privát-kulcs : (9207956627620097863, 10742616072138062647)
Példa, titkosítás, visszafejtés, - baby változat legyen az üzenet 0x3f 0xa9 0x4b 0xd2 0xb8, ekkor a szöveghez tartozó szám a következő: 63 256 0 + 169 256 1 + 75 256 2 + 210 256 3 + 184 256 4 = 793802156351 titkosítás: 793802156351 7 (mod 10742616072138062647) = 9234224821721448476 visszafejtés: 9234224821721448476 9207956627620097863 (mod 10742616072138062647) = 793802156351 a kapott számot visszaalakítjuk bájtokká: meghatározzuk a szám 256-al való osztási maradékait.
RSA, biztonsági problémák az n faktorizálásához kapcsolódó problémák a k nagyságrendje: min 1024 bit Fermat féle faktorizáció: a p és a q ne legyenek túl közel egymáshoz Pollard ρ féle faktorizáció: p 1, illetve p + 1-nek legyen legalább egy nagy prímosztója, legjobb módszer: ha véletlenszerűen választjuk meg a prímeket,... ugyanannak a p, vagy q prímnek a többszöri felhasználása a modulus többszöri felhasználása, különböző e értékekre az e, d megválasztása: e kicsi kell legyen, d azonban az n nagyságrendjével kell egyenlő legyen az RSA-textbook (baby) nem biztonságos, mert a titkosító algoritmus nem véletlenszerűsített választott nyílt-szöveg típusú támadás. az RSA titkosító multiplikatív tulajdonságú választott rejtjelezett-szöveg típusú támadás.
Az RSA multiplikatív tulajdonsága Az RSA multiplikatív tulajdonsága azt jelenti, hogy fennáll: Példa: (a e b e ) = (a b) e legyen p = 60077, q = 37189 két primszám meghatározzuk az n, phi, e, d értékeket: n = p q = 2234203553 phi = (p 1) (q 1) = 2234106288 e = 5 d = 1340463773, ahol e d = 1 (mod phi) legyen a = 10000, b = 30000 fennáll A B = (a b) e, ahol: A = a e (mod n) = 2077758732 B = b e (mod n) = 2199572451 (A B) (mod n) = 71336309 (a b) e (mod n) = 71336309
RSA a gyakorlatban az RSA visszafejtési algoritmus gyorsításának problémája a standardként elfogadott módszer az RSA-OAEP a gyakorlatban szinte soha nem használják titkosító algoritmusként, leggyakrabban kulcscsere protokollokban, a szimmetrikus rendszerek kulcsainak a megosztására használják, az alábbi forráskód mini kliens/szerver alkalmazásokat tartalmaz Pythonban, ahol a szerver.py/kliens.py felhasználva az RSA-t egyetlen egy klienssel oszt meg egy közös értéket (a szesszió kulcsot) a másik alkalmazásban (szerverrsa RC4.py/kliensRSA RC4.py) felhasználva a megosztott szesszió kulcsot (ez lesz az RC4-kulcs) a szerver titkos üzeneteket tud küldeni a kliensnek, ahol az üzenetek titkosítását RC4-el végeztük forráskód
Az RSA-OAEP rendszer 1995-ben Bellare és Rogaway publikálja, az RSA CCA-biztonságú változatát helyes paraméterezés esetében az RSA-OAEP a jelenlegi standardnak megfelelő biztonságot garantálja standardizált leírása megtalálható a PKCS#1 v2.0. egy véletlen bit-generátort és egy hash függvényt használ az RSA-függvény elveszíti multiplikatív tulajdonságát és probabilisztikus lesz az e = 3 publikus kulcs esetében is megfelelően biztonságos lesz egyszerűsített változata: az SAEP rendszer, David Boneh publikálta 2001-ben, az RSA-függvény helyett a Rabin-függvényt használjuk: R n : {Z n Z n, x x 2 (mod n)},
Az RSA-OAEP rendszer Titkosítás: A nyílt-szöveg P = (Z 2 ) l P, a titkos szöveg C = (Z 2 ) l H +l G halmazon van értelmezve, az m nyílt szöveget szeretnénk titkosítani, legyen r {0, 1} k véletlenszerű bitsorozat, x = m 0 l G l P, (m-et kiegészítjük nullásokkal), meghatározzuk y = (x G(r)) (r H(x G(r)))), a titkosított érték: Enc pk (y) = y e (mod n) c Visszafejtés: meghatározzuk az y = c d (mod n) értéket felosztjuk y-t y 1 y 2 -re úgy, hogy y 1 = l G és y 2 = l H, meghatározzuk r = H(y 1 ) y 2, meghatározzuk x = y 1 G(r), ellenőrizzük, hogy x utolsó l G l P bitje nulla-e: ha nem, akkor REJECT kimeneti értékkel leállunk, ellenkező esetben vissza térítjük x első l P bitjét.
Az RSA-OAEP rendszer Jelöljük a véletlen bit-generátort: jelöljük a hash függvényt: G : {0, 1} l H {0, 1} l G, H : {0, 1} l G {0, 1} l H. a standardban H függvénynek az SHA újabb verzióját használják (min 160 bites), a G függvény szerkesztéséhez szintén az SHA újabb verzióját használják, G(r) = SHA j (r < 0 >) SHA j (r < 1 >)..., ahol r véletlen bitsorozat és az < i > jelölés az i kettes számrendszerbeli értékét jelenti 4 bájton ábrázolva, az SHA j jelölés azt jelenti, az SHA függvény első j, legnagyobb helyértékű bájtjait használjuk fel. Tipikus esetben, ha a modulus 1024 bites, azaz 128 bájtos, akkor l H = 20 bájt, l G = 108 bájt, j = 10 bájt.
Valószínűségi prímtesztek Az algoritmusok kimenete olyan számot ad, amely csak nagy valószínűséggel prím: a Fermat prímteszt: a kis Fermat-tételen alapszik, nagy a tévedési aránya a Miller-Rabin prímteszt: ezt használják a legtöbb kriptográfiai protokollban, a Solovay-Strassen prímteszt: gyakorlati haszna kisebb, mint a Miller-Rabin tesztnek, mert nagyobb a tévedési aránya,...
Az RSA gyorsítása Alkalmazható a kínai maradéktétel a visszafejtés időigényének javítása érdekében. Alkalmazásával a rendszer nem veszít biztonságából. Ahelyett hogy az n nagyságrendjével megegyező d hatványkitevővel számolnánk, elvégzünk két kisebb (a p nagyságrendjével megegyező) hatványkitevővel való hatványozást. Meghatározzuk dp, dq, Mq, Mp értékeket a következő módon: dp = d (mod p 1) dq = d (mod q 1) q Mq = 1 (mod p) p Mp = 1 (mod q). A c d (mod n) értéket megadja az x értéke, ahol x = (Mq q xp + Mp p xq) (mod n) xp = c dp (mod p) xq = c dq (mod q).