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.