Kriptográfiai bevezető

Alapelemek

Ha érzékeny információkat nem biztonságos csatornán kell továbbítanunk (vagy nem biztonságos környezetben kell tárolnunk), gondoskodnunk kell az információ védelméről. Ezt például különféle kódolási, kriptográfiai módszerek segítségével tehetjük meg. Az információt titkosíthatjuk(hogy illetéktelen személyek ne ismerhessék meg) vagy hitelesíthetjük (hogy illetéktelen személyek ne módosíthassák észrevétlenül).

 

Akár kriptográfiai titkosításról, akár hitelesítésről (pl. aláírásról) van szó, az információt először kódolnunk kell, majd később, amikor fel szeretnénk használni dekódolunk kell (azaz vissza kell fejtenünk). Mind a kódolás, mind annak visszafejtése (dekódolás) általában valamilyen kriptográfiai kulcs segítésével történik. E megoldások biztonsága arra épül, hogy a dekódoláshoz, illetve a hitelesítéshez szükséges kriptográfiai kulcsok kizárólag a jogosult felek birtokában vannak.

A kulcs egy szám, bitsorozat, amely meghatározott hosszúságú lehet. E hosszúságot nevezzük kulcsméretnek, amelye alapvetően meghatározza a kódolás biztonságát. Amikor a kulcsot létrehozzuk (ezt nevezzük kulcsgenerálásnak, az adott hosszúságú bitsorozatok közül – valamilyen véletlent is használó módszerrel – kiválasztunk egyet.

A támadó, aki nem ismeri a dekódoláshoz vagy hitelesítéshez használt kulcsot, megpróbálhatja kitalálni a kulcsot, ezt nevezzük a kódolás megtörésének. Ennek egyik módja, hogy egy számítógép segítségével az összes lehetséges (adott hosszúságú) kulcsot kipróbálja. Ha a kulcs elég hosszú, akkor ez nagyon nehéz feladat is lehet.

Szimmetrikus kulcsú és aszimmetrikus kulcsú kriptográfia

Szimetrikus kulcsú kriptográfia

A rendelkezésünkre álló kriptográfiai megoldások két nagy csoportra oszthatók: szimmetrikus kulcsú kriptográfiai megoldásokra, valamint aszimmetrikus kulcsú (más néven nyilvános kulcsú) kriptográfiai megoldásokra. Mindkét csoport alkalmas mind titkosításra, mind hitelesítésre.

A szimmetrikus kulcsú titkosítás során a dokumentumot ugyanazzal a kulccsal kódoljuk, amivel majd dekódolni is lehet; a kódolásra és dekódolásra használt kulcsot ekkor titkokban kell tartanunk, ezért titkos kulcsnak is nevezzük. E módszer hátránya, hogy a titkos kulcsot biztonságos módon kell eljuttatni a fogadó fél számára, hogy illetéktelen fél ne ismerhesse meg. Ez bizonyos esetekben nagyon nehéz problémát jelenthet.



Szimmetrikus kulcsú kriptográfia esetén kódoláshoz és dekódoláshoz ugyanazt a kulcsot használjuk. Így - függetlenül attól, hogy a kulcsot hol generáljuk - a kulcs biztonságos, titkos csatornán kell, hogy eljusson mind a kódolóhoz, mind a dekódolóhoz.
 

A szimmetrikus kulcsú kriptográfia hitelesítésre is alkalmas, ekkor ún. kriptográfiai ellenőrző összeg számítható egy üzenetből a titkos kulcs alapján. E megoldásnak korlátja, hogy ugyanazon titkos kulcs szükséges az ellenőrző összeg ellenőrzéséhez, mint amivel ki lehet azt számítani. Így e megoldás nem alkalmas arra, hogy egy dokumentum hitelességét a közös titkos kulcsot nem ismerő harmadik fél számára igazoljuk. Ha mégis erre van szükségünk, nyilvános kulcsú kriptográfiát – például elektronikus aláírást – kell használnunk.

A szimmetrikus kulcsú titkosítás előnye, hogy az ilyen megoldások gyorsak és rövid kulcsokkal (pl. 128 bit vagy 256 bit) dolgoznak, és elég sok szimmetrikus kulcsú algoritmust ismerünk. Szimmetrikus kulcsú titkosító algoritmusok például a következők: DES (már nem használatos), 3DES, AES (másnéven Rijndael), Blowfish, stb.

Aszimetrikus kulcsú (nyilvános kulcsú) kriptográfia

Az aszimmetrikus kulcsú (más néven nyilvános kulcsú) kriptográfia ezt a hátrányt küszöböli ki úgy, hogy a kódolás és a dekódolás nem ugyanazzal a kulccsal történik. Minden félnek van egy nyilvános kulcsa és egy magánkulcsa. A magánkulcs soha nem kerül ki birtokosa tulajdonából, de bárki hozzáférhet mások nyilvános kulcsához. A nyilvános kulcsot nem kell titokban tartani, azt bárki megismerheti.

Ha titkosított üzenetet szeretnénk küldeni valakinek, meg kell szereznünk az ő nyilvános kulcsát, és azzal kell kódolnunk a neki szóló üzeneteket. Az így kódolt üzeneteket a címzett a saját magánkulcsával fejtheti vissza.



Nyilvános kulcsú (más néven aszimmetrikus kulcsú) kriptográfia esetén a kódolás és a dekódolás különböző kulcsokkal történik. Ekkor elegendő az egyik kulcsot titokban tartanunk, a másik kulcsot akár nyilvános csatornán is továbbíthatjuk.
 

A nyilvános kulcsú kriptográfia más módon is használható: ha a saját magánkulcsunkkal kódolunk egy dokumentumot, az így kapott adatról – a nyilvános kulcsunk alapján – bárki megállapíthatja, hogy azt mi hoztuk létre. E műveletet aláírásnak nevezzük.

  Az elektronikus aláírásról szeretne olvasni?

A nyilvános kulcs és a magánkulcs kulcs között matematikai összefüggés van, a nyilvános kulccsal kódolt adat a hozzá tartozó magánkulccsal dekódolható, valamint a magánkulccsal kódolt adat is dekódolható (azaz az aláírás ellenőrizhető) a nyilvános párjával. Ugyanakkor, nem szabad, hogy a nyilvános kulcsból (hatékonyan, reális mennyiségű erőforrással) ki lehessen számítani a magánkulcsot.

A nyilvános kulcsú kriptográfiai algoritmusok előnye, hogy segítségükkel úgy is kommunikálhatunk valakivel biztonságosan (titkosan vagy hitelesen), hogy előtte nem állapodtunk meg közös titkos kulcsban. Ugyanakkor, alapvető követelmény, hogy hitelesen jussunk hozzá a másik fél nyilvános kulcsához. Egy kulcs használata előtt meg kell bizonyosodnunk róla, hogy a kulcs valóban annak a személynek (szervezetnek) a birtokában van, akinek titkos üzenetet szeretnénk küldeni, vagy akinek az aláírását ellenőrizni szeretnénk. E célra tanúsítványokat szokás használni. A tanúsítvány egy megbízható szervezet, egy hitelesítés szolgáltató által kiállított igazolás arról, hogy egy adott magánkulcs egy adott személyhez vagy entitáshoz (alanyhoz) tartozik.

  A tanúsítványokról szeretne olvasni?
Hátrányuk, hogy jelentősen lassabbak a szimmetrikus kulcsú kriptográfiai algoritmusoknál, és lényegesen hosszabb kulcsokat használnak. Például, az RSAalgoritmus esetén ma a 2048 bit hosszú kulcs hosszú távon is biztonságosnak minősül, míg pl. az AES szimmetrikus kulcsú algoritmus esetén a 256 bites kulcs hasonló szintű biztonságot jelent. (Megjegyezzük, két kriptográfiai algoritmus nyújtotta biztonság nagyon nehezen hasonlítható össze.)

 

További probléma, hogy viszonylag kevés nyilvános kulcsú kriptográfiai algoritmust ismerünk. A legelterjedtebb nyilvános kulcsú algoritmus az RSA, de léteznek más, kevésbé ismert nyilvános kulcsú rendszerek is. Ilyenek például a diszkrét logaritmus problémára épülő algoritmusok (El Gammal, DSA) és ezek elliptikus görbéken értelmezett változatai (EC El Gammal, ECDSA) és ilyen például az NRTU is.

  Az RSA algoritmusról szeretne olvasni?
  Az elliptikus görbékre épülő kriptográfiáról szeretne olvasni?

Lenyomatképző függvények

A lenyomatképző függvények (hash függvények) tetszőleges hosszúságú üzenetet fix hosszúságú bitsorozatba képeznek le. Az így kapott eredményt hash értéknek vagy lenyomatnak is nevezik. Mivel a bemenet hossza nagyobb, mint a lenyomat vagyis kimenet hossza, így elvileg nem kizárt, hogy két különböző üzenet hash értéke megegyezik. Két alapvető követelményt szokás támasztani a hash függvényekkel szemben: A gyakorlatban a legelterjedtebb hash az SHA-1, bár sokat használják a már nem biztonságos MD5függvényt is. Az MD5 128 bites, a SHA-1 160 bites hash értéket állít elő, viszont mindkettő 512 bites blokkokban dolgozza fel az üzeneteket.

 

Az MD5 már nem biztonságos, mert rá már nem teljesül az ütközés ellenállóság: Már létezik hatékony algoritmus, amellyel értelmes, azonos MD5 lenyomattal rendelkező fájlokat találhatunk. Sőt, már olyan, MD5-re épülő tanúsítványokat is sikerült létrehozni, amelyek azonos MD5 lenyomatra épülnek, így azonos aláírás szerepel bennük. Így, ahol ütközés-ellenállóságra van szükség, ott már nem szabad md5 lenyomatokat használni.

A közelmúltban ütköző SHA-1 lenyomatokat is találtak, és már van olyan – az elvi korlátnál hatékonyabb – algoritmus, amellyel további ütköző lenyomatú fájlokat lehet készíteni. Ennek egyelőre csak elvi jelentősége van, de várható, hogy a közeljövőben az SHA-1-et (egy vagy több) másik hash függvény váltja majd fel. SHA-1 helyett egyelőre a hasonló elvekre épülő, de hosszabb lenyomatokkal működő SHA-224, SHA-256, SHA-384 és SHA-512 (összefoglaló nevükön SHA-2 algoritmusokat lehet használni.

Hogyan kombinálhatóak ezen alapelemek?

Üzenetek titkosítása

Amikor titkos üzenetet küldünk valakinek, általában nem a teljes üzenetet titkosítjuk a címzett nyilvános kulcsával, mert ez nagyon lassú és időigényes volna. Ehelyett (minden egyes üzenet titkosításához) kisorsolunk egy véletlen szimmetrikus kulcsot, és csak ezt a szimmetrikus kulcsot titkosítjuk a címzett nyilvános kulcsával, magát az üzenetet pedig ezen szimmetrikus kulccsal titkosítjuk.

Az üzenet címzettje a saját magánkulcsa segítségével vissza fejteni a nyilvános kulcsával titkosított szimmetrikus kulcsot, és e szimmetrikus kulcs birtokában vissza tudja fejteni az üzenetet is.

Előnye e megoldásnak, hogy egy fájlt, dokumentumot úgy is titkosíthatunk, hogy azt több címzett is visszafejthesse. Ilyenkor a fájl titkosítására használt szimmetrikus kulcsot külön-külön be kell titkosítani minden egyes címzett nyilvános kulcsával, és az így betitkosított blokkokat kell elküldenünk a fájllal együtt.

Így működik például a levelezőprogramok által használt S/MIME vagy a W3C által kifejlesztett XML encryption is.

Digitális aláírás

Aláíráskor nem a teljes dokumentumot szokás kódolni a magánkulccsal. Ez egyrészt nagyon lassú és időigényes volna, másrészt szeretnénk pontosan tudni, hogy mikor és hányszor írunk alá. Ezért egy lenyomatképző függvénnyel kriptográfiai lenyomatot képzünk az aláírandó dokumentumból, és csak ezt a lenyomatot kódoljuk a magánkulcsunkkal. (Így a magánkulccsal csak egyetlen műveletet végzünk.) A magánkulcsunkkal kódolt, aláírt lenyomatot nevezzük aláírásnak. Amikor a technológia által is elismert változatáról szólunk, akkor a digitális aláírás helyett az elektronikus aláírás szokás használni.

 

Aki ellenőrizni szeretné az aláírást, annak az aláírt dokumentumra is szüksége van. Ellenőrzéshez neki is lenyomatot kell képeznie az aláírt dokumentumból, majd az aláíró nyilvános kulcsával kódolnia kell a dokumentumhoz tartozó aláírást (így azt a lenyomatot kapja vissza, amit az aláíró aláírt). Ha az általa képzett lenyomat megegyezik az aláírásból visszanyert lenyomattal, akkor az aláírás érvényes.

  Ha az aláírás tanúsítványra alapul, további lépéseket is el kell végezni az aláírás ellenőrzéséhez. Kattintson ide, ha ennek részleteiről szeretne olvasni.

Biztonságos bejelentkezés

Gyakori, hogy nem levelek küldésekor, hanem online kapcsolatok felépítésekor használnak kriptográfiai módszereket. Ekkor a két fél – a kliens és a szerver – általában nyilvános kulcsú kriptográfiai módszerek segítségével közös szimmetrikus kulcsokban állapodnak meg (ezt nevezzük kulcscserének), és a kommunikációt később ezen szimmetrikus kulcsú módszerekkel titkosítják, hitelesítik.

 

E megoldás egyik alapköve a kihívás és válasz alapú hitelesítés (challenge and response authentication), melynek keretében például a szerver megállapíthatja, hogy valóban a klienssel kommunikál-e. Példánkban a szerver egy véletlen számot generál, és azt küldi el a kliensnek, és a kliens a saját magánkulcsával kódolja azt. Az így kódolt véletlen számot visszaküldi a szervernek, aki a kliens nyilvános kulcsával dekódolja – megállapítja, hogy valóban a kliens magánkulcsával kódolták-e az általa generált véletlen számot.

  A kihívás és válasz alapú hitelesítésről (autentikációról) szeretne olvasni?

(Ekkor magánkulccsal való kódolás történik ugyan, de e művelet jogi értelemben nem nevezhető elektronikus aláírásnak, hiszen itt jogi értelemben nem történik aláírás. Az elektronikus aláírásról szóló törvény szerint az aláírás-létrehozó adatot kizárólag elektronikus aláírás létrehozására szabad felhasználni (13. § (4)), ennek egyik oka, hogy még véletlenül se keveredhessen össze, hogy valaki épp alá akart írni egy dokumentumot, vagy csak egy szerverre akart bejelentkezni. Így az aláírásra használt kulcspárt semmilyen más célra nem szabad használni.)

A fent leírt kihívás és válasz alapú hitelesítésre, majd azt követően szimmetrikus kulcok alapján történő titkosított és hitelesített kommunikációra épül például az SSH és az SSL protokoll (de sok VPN megoldás is így működik). SSH és SSL esetén általában csak a kliens győződik meg kriptográfiai módszerek segítségével a szerver kilétéről (és a szerver ilyenkor csak a kliens jelszavát ellenőrzi), de mindkét megoldás támogat kétoldalú kihívás és válasz alapú hitelesítést is.

  Az OpenSSL program segítségével szeretne kriptográfiai műveleteket végezni?