Ahhoz, hogy a könyv további része érthető legyen meg kell ismerkednünk a szakirpdalom pár kifejezésével:
-
Plain text vagy clear text (Egyszerű szöveg)
TitkosÃttatlan szöveg, ami titkosÃtásra kerül, az algoritmusok bemenete.
-
Ciphertext (Rejtjelezett szöveg)
A TitkosÃtott szöveg, amit algoritmus állÃt elÅ‘ a bemeneti szövegbÅ‘l.
-
Encryption (TitkosÃtás)
A folyamat, amely létrehozza az egyszerű szövegbÅ‘l a titkosÃtott szöveget.
-
Decryption vagy Deciphering (Dekódolás, visszafejtés)
A folyamat, amely során titkosÃtott szövegbÅ‘l egyszerű szöveg lesz.
-
Encryption algorithm (TitkosÃtó algoritmus)
A titkosÃtás műveletsora. Mindig két bemenete van: titkosÃtandó szöveg és titkosÃtó kulcs.
-
Decryption algorithm (Visszafejtő algoritmus)
A visszafejtés műveletsora. Két bemenete: titkosÃtott szöveg és titkosÃtást feloldó kulcs.
-
Private key (Privát kulcs)
A titkosÃtást feloldó kulcs elnevezése két kulcsos rendszerek esetén.
-
Public key (Publikus kulcs)
A titkosÃtás létrehozásához használt kulcs elnevezése két kulcsos rendszerek esetén.
-
Symetric Key (szimmetrikus kulcs)
Egykulcsos rendszerek esetén a titkosÃtó és a titkosÃtást feloldó kulcs elnevezése.
TitkosÃtási rendszerek esetén beszélhetünk szimmetrikus és aszimmetrikus rendszerekrÅ‘l. Az aszimmetrikus titkosÃtás csak az elmúlt század második felében vált ismertté, Ãgy az összes klasszikus algoritmus szimmetrikus felépÃtésű volt.
A bemeneti adat feldolgozásának szempontjából beszélhetünk stream alapú titkosÃtásokról és blokk alapú titkosÃtásokról. A stream alapú titkosÃtások bitenként, vagy papÃr alap esetén karakterenként dolgozzák fel a bemeneti információt. A blokk alapú titkosÃtási rendszerek pedig a bemeneti adatot fix méretű blokkokként kezelik és a blokk egészén végeznek műveleteket. A legtöbb ma használt algoritmus blokkokban dolgozik sebességbeli és biztonságbelei megfontolások miatt.
Törési módszerek
Többféleképpen nekiállhatunk egy kód feltörésének. A legegyszerűbb és legjobban erőforrás pazarló módszer a Brute Force. Ez azt jelenti, hogy az összes lehetséges kombinációt ki kell próbálni.
Ha egy kicsit gondolkodunk és megvizsgáljuk a visszafejtendÅ‘ kódot, akkor előállhatunk rafináltabb módszerekkel, amelyek segÃtségével könnyebben vissza tudjuk fejteni az eredeti információt. Ideális esetben a titkosÃtó algoritmus nem rendelkezik hibákkal és csak Brute Force módszerrel törhetÅ‘ fel.
A Brute Force töréshez szükséges idÅ‘ erÅ‘sen függ a kódolás bonyolultságától, valamit a töréshez használt gép sebességétÅ‘l. Éppen ezért fontos kérdés, hogy belátható idÅ‘n belül feltörhetÅ‘-e a rendszer vagy nem. A belátható idÅ‘ fogalma erÅ‘sen relatÃv. Éppen ezért jobb kifejezés egy módszer biztonságosságának megÃtélésére az, hogy megnézzük, számÃtásilag biztonságosnak tekinthetÅ‘-e.
Egy algoritmus számÃtásilag biztonságosnak tekintett, ha a feltöréséhez annyi erÅ‘forrás és idÅ‘ szükséges (pl. 1000 év), ami nem áll senki rendelkezésére. Ebbe a kategóriába esik a legtöbb algoritmus. Azonban a számÃtástechnika fejlÅ‘désével a korábban számÃtásilag biztonságosnak tekintett algoritmusok elavulhatnak és el is fognak avulni. Éppen ezért a rendszereket idÅ‘közönként felül kell vizsgálni.
A Feltörhetetetlen titkosÃtás, avagy a One-time pad
Az eddigi bevezetÅ‘ alapján úgy tűnhet, hogy nincs olyan titkosÃtás, amit ne lehetne feltörni, maximum kevés idÅ‘ áll rendelkezésre. Azonban ez nem Ãgy van, létezik egy algoritmus, ami a megfelelÅ‘ használati és implementációs körülmények között visszafejthetetlen a kulcs nélkül, még akkor is ha a támadónak végtelen ideje van.
Ez az algoritmus a one-time pad, vagy röviden OTP algoritmus. Az algoritmus lényege, hogy a kulcs egyes bitjeit XOR művelet segÃtségével kombináljuk a kulcs bitjeivel. Az Ãgy kapott kimeneti adatfolyam a kulcs ismeretének hiányában nem fejthetÅ‘ vissza és nem is törhetÅ‘ meg, amÃg az alábbi szabályokat betartjuk:
- A kulcsnak legalább olyan hosszúnak kell lennie, mint a bemeneti adatnak.
- A kulcsnak véletlenszerűen generáltnak kell lennie, nem tartalmazhat mintákat, ismétlődéseket
- A használt kulcsot nem szabad újra felhasználni, még részben sem.
- A kulcsot a küldő és fogadó félnek teljesen titokban kell tartaniuk.
Az OTP algoritmus tipikusan implementációs hibákon szokott elbukni. Ilyen implementációs hiba a kulcsgenerálást szokta illetni. Ha a kulcs ismétlődik, vagy ismétlődő elemeket tartalmaz, akkor könnyen kitalálható.
Ha ennek a kivitelezése sikerül, akkor a másik probléma az, hogy a kulcs ugyan olyan hosszú lesz, mint az adat. Ez megnehezÃti a kulcs eljuttatását, cseréjét két fél között. Éppen ezért a gyakorlatban az ilyen kulcsok egy másik módszerrel titkosÃtott csatornán kerülnek célba juttatásra. Ha ez nem Ãgy történik, akkor a kulcs nem tekinthetÅ‘ biztonságosnak, mivel egy 3. fél a nem titkosÃtott csatornán megszerezheti.
Az algoritmust eredetileg 1882-ben Ãrta le Frank Miller, majd 1917-ben Gilbert Vernam újra feltalálta és 1919-ben szabadalmaztatta is az eljárást. Ezért szoktak az algoritmusra Vernam algoritmusként is hivatkozni.
Kerckhoffs elv
Auguste Kerckhoffs kriptográfus ismerte fel és mondta ki a 19. század végén, hogy egy titkosÃtási rendszernek biztonságosnak kell lennie, még akkor is, ha a rendszerrÅ‘l a kulcs kivételével minden nyilvánosan ismert.
Ez a gyakorlatban azt jelenti, hogy olyan algoritmust, módszert ne használjunk, ami zárt forráskóddal rendelkezik, mert önmagában a módszer ismeretének a hiánya nem elegendÅ‘ az adatok megfelelÅ‘ védelméhez. Az ilyen nem nyÃlt rendszereket a szakirodalom security through obscurity, vagyis biztonság a homályon keresztül kategóriába sorolja.
Ezekkel a rendszerekkel a probléma az, hogy a módszer, amivel dolgoznak elÅ‘bb-utóbb kiismerhetÅ‘, visszafejthetÅ‘, még akkor is ha a gyártó mindent elkövet a kód visszafejtésének megakadályozása érdekében. Éppen ezért, ha egy olyan algoritmus van alkalmazva, amirÅ‘l matematikailag nem bizonyÃtott, hogy biztonságos, akkor az nagy valószÃnűséggel törhetÅ‘.
Implementációs hibák, FIPS minÅ‘sÃtés
Ha a használt módszer matematikailag bizonyÃtott módon is biztonságos, akkor is az egyes implementációkba kerülhetnek hibák, mint minden szoftverbe. Ezek a hibák végsÅ‘ soron gyengÃthetik a titkosÃtást, ami lehetÅ‘vé teszi, hogy egy támadó bÅ‘ven a belátható idÅ‘n belül visszafejtse a titkosÃtott adatot.
Éppen ezért született meg a Federal Information Processing Standard vagy FIPS, ami valójában egy szabványgyűjtemény, ami definiál szabványos algoritmusokat, implementációs követelményeket, minimális kulcsméreteket és egyéb biztonsághoz kapcsolódó elvárásokat.
Ilyen minÅ‘sÃtéssel az operációs rendszer és a keretrendszer is rendelkezhet. A Windows rendelkezik FIPS minÅ‘sÃtéssel, de a megfelelÅ‘séghez szükséges funkciók nem tartományi, egyedi telepÃtésekben nincsenek engedélyezve, mivel egy átlag felhasználónak nem feltétlen van erre szüksége.
A .NET is rendelkezik FIPS minÅ‘sÃtéssel, ami a beépÃtett kriptográfiai eljárásokat, módszereket illeti. Azonban nem köti meg a programozó kezét, hogy csak FIPS elÅ‘Ãrásoknak megfelelÅ‘ algoritmusokat használhasson. Éppen ezért attól, hogy a program .NET-re Ãródott még nem garantálja azt, hogy a program FIPS követelmények megfelel.
ElÅ‘fordulhat, hogy olyan titkosÃtási algoritmust szeretnénk vagy kell alkalmaznunk, ami tudjuk hogy biztonságos, de nincs még implementálva a .NET-ben. Ebben az esetben nem ajánlott magunknak implementálni, fÅ‘leg, hogy nagy valószÃnűséggel a Bouncy Castle (https://www.bouncycastle.org/)-ben már van egy FIPS minÅ‘sÃtésű implementációja.
A fura nevű könyvtár mögött a Legion of the Bouncy Castle alapÃtvány áll, akik még az 1990-es évek végén azt tűzték ki célul, hogy nyÃlt forráskódú kriptográfiai könyvtárcsomagot készÃtenek. A C# verzió a https://www.bouncycastle.org/csharp/ cÃmrÅ‘l szerezhetÅ‘ be.