2023. november 30., csütörtök

Kódolási algoritmusok

A kriptográfia (ógörög eredetű kif., κρυπτός (kryptós) = „rejtett”, γράφειν (gráphein) = „írni”, tehát „titkosírás”) egy mára önállóvá vált, erősen matematikai jelleget kapott, interdiszciplináris jellegű, de elsősorban informatikai tudományág, amely a rejtjelezéssel, titkosírásokkal, kódolással; azok előállításával és megfejtésével foglalkozik. Bizonyos okok miatt azonban azt is mondhatjuk, hogy a kriptográfia a matematika része; utóbbi tudományon belül a számelmélet, algebra, számításelmélet és valószínűségszámítás határterületeként sorolható be. Eredetileg, a 19. sz. előtt a nyelvtudomány részének tartották. Egy kommunikációs folyamat során továbbított nyilvános üzenetet akkor nevezünk titkos(ított)nak, ha a feladó olyan formá(tum)ban küldi, amit olvasni vagy fogadni esetleg többen is tudnak, de megérteni csak a fogadók egy megcélzott csoportja. A titkosságra való törekvés az emberi társadalmak velejárója; amely elsősorban a civil és katonai (titkos)ügynökségek, állami szervezetek, a diplomácia, az ipari vagy egyéb kutatást is végző vállalatok, a személyes és visszaélésre is alkalmas adatokat kezelő cégek (bankok stb.), és általában szinte mindenki számára fontos. A kriptográfia jelen van mindennapjainkban is. A titkosítandó szöveget vagy üzenetet nyílt szövegnek (plain text) nevezzük. Maga a titkosító eljárás egy algoritmus, amely a nyílt szöveget egy másik szöveggé alakítja. Az utóbbi szöveget nevezzük titkosított szövegnek (cipher text). Az algoritmus alkalmazása a nyílt szövegre a kódolás vagy rejtjel'(e)'zés. A nyílt szöveget tekinthetjük számsorozatnak, a titkosított szöveget hasonlóképp, ilyen felfogásban a titkosító algoritmus egy matematikai függvény. Erről fel kell tennünk, hogy injektív, mivel a címzettnek vagy fogadónak képesnek kell lennie arra, hogy egyértelműen visszanyerje a nyílt szöveget a titkosított szövegből. Utóbbi folyamat, azaz a visszanyerés a dekódolás vagy (vissza/meg)fejtés. Hogyan lehetséges, hogy a rejtjelezett szöveget mindenki olvasni tudja, de csak a felhasználó tudja megérteni, azaz csakis ő legyen képes a visszafejtésre? Ezt a lehetőséget az ún. kulcs biztosítja. A kulcs a rejtjelző eljárás egy olyan paramétere, amelyet csak a küldő és a megcélzott fogadók, a címzettek ismernek. A többi fogadó általában ismeri a rejtjelzés algoritmusát, illetve annak főbb elemeit, de nem ismeri a kulcsot. Enélkül pedig nem tudja, a rejtjelezett szöveg konkrétan milyen függvény alkalmazásával állt elő, és kénytelen egy általában végtelen nagy függvénycsaládon belül keresgélni. Ez néha elméletileg is, gyakrabban azonban szimplán csak gyakorlatilag, lehetetlenné illetve túlságosan költségessé teszi számára a visszafejtést. Az olyan illetéktelen fogadókat, akiknek érdekükben is áll a nem nekik címzett titkos üzenetek visszafejtése és ezzel meg is próbálkoznak, gyakran támadó feleknek, míg a küldőket és illetékes címzetteket legális feleknek is nevezzük. 1941-ben még a JN-25-ös kódot használták, ami szavak titkosítására szolgált. 1943-ban Colossus megépítése után a legelső programozható számítógép volt. Ennek köszönhető a titkosítási eljárások hirtelen fejlődése beindult. 1952-ben az NSA megszületése forradalmasította a hírszerzést. RSA KÓDOLÁS
Az RSA lényege, hogy a titkosítás kulcsa nyilvános, vagyis azt bárki ismerheti. Csak a dekódolás kulcsa az, ami titkos.

Az alapötlete a következő:

Veszünk két jó nagy prímet, p
-t és q
-t amit csak mi ismerünk, ezek titkosak.

Elkészítjük az N=p⋅q
 számot és φ(N)
-et, amit csak mi ismerünk.

Ha p
 és q
 többszázjegyű prímek, akkor N
 prímfelbontása a jelenlegi számítógépekkel több ezer évig tartana, és így φ(N)
 kiszámolása is lehetetlen.

Végül már csak egy dolog kell, egy e
 kitevő, amire teljesül, hogy (e,φ(N))=1
Ezt követően jön a titkosítás.

A visszafejtéshez pedig az Euler-Fermat tétel kell, aminek segítségével megalkotjuk a d
 megfejtő kulcsot.

A kriptográfia olyan fontosságúvá vált, hogy kormányhivatal létrehozását tette szükségessé. 1973-ban blokk kódoló eljárást alkalmaztak, Horn Feistel munkájának köszönhetően, egyre jobb algoritmusok születhetnek. 1976-ban történt meg a DES szabvány bevezetése. Ez volt az első szabványosítható titkosító eljárás. 1977-ben RSA eljárás kifejlesztése következett. Az első két kulcsos (titkos és nyílvános) eljárás, ami az internet fejlődéséhez alapvetően járult hozzá. 1991-ben  jelent meg a PGP titkosítási eljárás. Ez már  alkalmaz szimmetrikus és aszimmetrikus eljárásokat is, ezáltal gyors és biztonságos. 1994-ben megjelent végre a SSL titkosítási protokoll, ami az internet világában nagyobb biztonságot biztosított. 1995-ben megjelent a digitális aláírás, ami kiváltja a hagyományos kézi aláírást, és az ezzel járó biztonsági hátteret, ezzel egyszerűsíti a mindennapi életünket. 2001-ben az AES titkosítási szabvány megjelenése forradalmasította a kódolás folyamatát. Megjelent a katonai szintű titkosítás. Ha a katonaság számára elég jó, akkor biztos nekünk is jó lesz, nem? Nos, nagyjából. A katonai szintű titkosítás manapság már inkább egy marketingfogás és pontos leírása nem nagyon van.A titkosítási eljárások alapja, hogy megfogunk valamilyen információt és összekuszáljuk úgy, hogy az átlagember számára értelmezhetetlenné válik. Természetesen a megfelelő eljárással a káoszból ismét rendet lehet teremteni, ha tudjuk, hogy mit kell alkalmazni. A folyamatot kódolásnak, titkosításnak lehet nevezni és szükség van hozzá egy kulcsra.Ha például meglátogatunk egy weboldalt, mely HTTPS titkosítással rendelkezik, és megadunk egy jelszót vagy egy bankkártya számot, akkor ezek az adatok titkosítva, összekuszálva kerülnek fel az internetre. Csak a te géped és a weboldal tudja értelmezni, ez pedig meggátolja, hogy illetéktelenek hozzáférjenek érzékeny adatokhoz. Amikor először csatlakozunk egy weboldalhoz, a weboldal és a számítógép végrehajtanak egy „kézfogást”, és megosztják a titkosításhoz és dekódoláshoz szükséges adatokat. Sokféle titkosítási eljárás létezik és vannak, melyeket nehezebb feltörni, mint másokat. Ha például VPN-en keresztül dolgozunk, merevlemezünkön titkosítunk fájlokat, jelszavainkat mentjük le valahova, vagy online bankolást végzünk, akkor erősebb titkosítást akarunk alkalmazni értelemszerű okokból. Itt jön a képbe a katonai szintű titkosítás, mellyel kapcsolat-ban azonban sok tévhit létezik. A katonaság nem definiálja, hogy mi számít ilyen titkosításnak. A „katonai szintű titkosítás” azt jelenti, hogy a legújabb technológiák sokszor először a katonaság kezébe kerülnek. Ilyen a  AES-256 titkosítás is. Az Advanced Encryption Standard, melynek 256 bites kulcsmérete van. Az AES-256 számít elvileg a tengeren túl az első olyan titkosításnak, melyet a National Security Agency (NSA) hagyott jóvá és „top secret”, tehát ultratitkos szinten védi adatainkat. Az AES-ből létezik 128 és 192 bites verzió is, azonban értelemszerűen a 256 bites magasabb szintű, nehezebben törhető titkosítást ad számunkra. Az AES-256 titkosítás egy igen erős, 256 bites titkosítás, melyet viszonylag nehéz feltörni. A katonaságon kívül a bankok is vagy a 256 bitest, vagy a 128 bites verziót használják, ezért banki szintű titkosításnak is nevezhetjük ezeket. Sokak szerint az AES szabványok számítanak a legjobb opciónak manapság a titkosítás terén, ezért széles körben használják változatos cégek. Az AES-256 szabványt olyan sok szervezet használja, hogy jó eséllyel mi is napi szinten belebotlunk, csupán nem tudunk róla, mert a legtöbb szolgáltatás nem hívja katonai szintű titkosításnak. A modern böngészők például támogatják az AES-256-ot, amikor biztosított HTTPS tanúsítvánnyal rendelkező weboldalakkal kommunikálnak. A modern persze elég tág fogalom, ugyanis már az Internet Explorer 8-ban is benne volt ez a funkció, amikor még a Windows Vista ideje volt. Természetesen a Chrome, Firefox és a Safari már régóta támogatja a titkosítást, és napi szinten kapcsolódhatunk olyan weboldalakra, melyek katonai szintű titkosítást használnak anélkül, hogy tudnánk erről. A Windows-ba beépített bitlocker például AES-128-at használ, de váltható 256-ra is. De akkor mi köze van a titkosításnak a katonasághoz? Nos, nyilván sok érzékeny adat van, mely nem kerülhet ellenséges kezekre, azonban igazából a titkosítás nem áll olyan közel a fegyveres erőkhöz, mint hinnénk. A titkosításnak főleg az információközlésben van szerepe. Sok évvel ezelőtt a kriptográfia fontos tudománya volt a háborúnak. A katonaságnak úgy kellett információt közvetítenie, hogy az ellenség azt ne tudja értelmezni, ha kezeikbe kerülne. A méltán híres Enigma kód is ilyen alapon született Németországban és sokáig nem is sikerült feltörni. Sok ország ezért a titkosítási technológiák exportját komoly szabályozások alá veti, hiszen a konfliktusoknak ma sincs vége. Az USA-ban például bárki létrehozhat egy új titkosítást, de azt nem exportálhatja külföldre.Érdekes dolog a titkosítás mindenesetre, mert alapvetően fontos manapság is adataink védelmében, habár most már nem a háborúban van rá elsődlegesen szükség, hanem a fogyasztói társadalom fenntartásában.

Globális adatstruktúra esetén fontoljuk meg a rögzített hosszok ésszerűen kis tömbtagok megadását ahelyett, hogy mutatókat használunk a dinamikusan lefoglalt memóriához. Kerüljük a dinamikus memóriafoglalást, különösen a gyakran használt függvények esetében.

Példa;

 typedef struct {
      int chID;
      ...
      char chName[SIZEOF_CHANNEL_NAME]; // This approach is preferable, and easier to use e.g. in a function stack.
      char *chName; // Unless this points to a constant, tracking a memory buffer introduces more complexity, to be weighed with the cost/benefit, especially when using multiple instances of the structure.
      ...
    } myConfig;

vagy konzitencia hiba estén;

 // This approach is preferable:
    MY_RESULT_TYPE getBuffer(void **ptr, size_t &size, [...other parameters..])
    
    // This should be avoided, as it lacks tracking the size of the returned buffer and a dedicated result code:
    void *getBuffer([...other parameters..])

Tehát a statikusan lefoglalt tömbök és a nagy memória-dinamikus implementációk mellett növekményes lefoglalási megközelítést javasolunk. Kezdje például az N előre lefoglalt objektumok üres üzenetsor-implementációjával; az (N+1)edik üzenetsor-leküldésen az üzenetsor egy rögzített X további előre lefoglalt objektummal (N=N+X) nő, amely addig marad dinamikusan lefoglalva, amíg az üzenetsor egy másik hozzáadása túlcsordul az aktuális kapacitásán, és további X előre lefoglalt objektumokkal növeli a memóriafoglalást. Végül implementálhat egy új tömörítési függvényt, amelyet takarékosan hívhat meg (mivel ez túl költséges lenne a rendszeres híváshoz), hogy felszabadítsa a nem használt memóriát. A dedikált index dinamikusan megőrzi az üzenetsor aktív objektumainak számát, amely a további túlcsordulás elleni védelem maximális értékére képezhető le. Ez a megközelítés kiküszöböli a folyamatos memóriafoglalás és felszabadítás által generált "csevegést" a hagyományos üzenetsor-implementációkban. Részletekért lásd: Memóriakezelés és -használat. Hasonló megközelítéseket alkalmazhat olyan struktúrákhoz, mint a listák, tömbök stb.  tárolókat, például a listákat és a vektorokat, azzal a kikötéssel, hogy a standard kódtárak memóriakorlátozásai miatt általában explicit módon kell kódolni vagy kódtárként csatolni őket. Ezek a kódtár-implementációk intenzív memóriahasználatot válthatnak ki, ha nem gondosan vannak megtervezve.

Nincsenek megjegyzések:

Megjegyzés küldése