Egy kis kriptográfia

Egy kis kriptográfia

Meg kell mondjam őszintén, az egész számítástechnikában és a programozásban engem két dolog nyűgöz le igazán. Az egyik a mesterséges intelligencia, a másik pedig a kriptográfia. A titkosítás tulajdonképpen már régebb óta foglalkoztat, még akkoriban kezdődött a dolog, amikor még a legnagyobb jóindulattal se mertem volna magamat programozónak nevezni. No de nézzünk valami elkódolást, ha már egyszer ez a bejegyzés címe. Választásom egy a Digitális Erőd című Dan Brown regényben is használt elkódolás egy kicsit bonyolultabb formájára esett. Megvalósítására PHP nyelven kerül sor, mivel PHP-ban könnyű stringeket kezelni és még fordítgatni se kell a dolgainkat.

Nézzük először meg, hogy hogyan is működik az eredeti technika. Fogunk egy szöveget, legyen ez esetünkben az "Ezt a rövid szöveget szeretném elkódolni." string. Először is kiszedjük belőle a szóközöket majd az egészet nagybetűsé alakítjuk és még a végére ékezetmentesítünk is (csak a biztonság kedvéért ugyebár, mert mind a szóköz mind pedig az éketezetes karakterek árulkodóak lehetnek). A kapott string az "EZTAROVIDSZOVEGETSZERETNEMELKODOLNI." lesz. Most jön a lényeg. Felírjuk a szöveget egy négyzetbe:

E Z T A R O
V I D S Z O
V E G E T S
Z E R E T N
E M E L K O
D O L N I .

Most jön a trükk, a szöveget ahelyett, hogy vízszintesen olvasnánk, függőlegesen olvassuk, így megkapjuk az "EVVZEDZIEEMOTDGRELASEELNRZTTKIOOSNO." stringet, ami az elkódolt szövegünk lesz. Az algoritmus - mai szemmel - természetesen egy cseppet sem mondható biztonságosnak. Jó, régebben se volt biztonságosnak mondható, mivel az elkódolás "jelszava" csupán az volt, hogy hányszor hányas négyzetbe írták bele a szöveget. Tehát aki tudta a módszert, csak ezt kellett kitalálnia, ami meg nem túl nehéz dolog, mivel a szöveg hosszából erősen következtetni lehet rá. A dolognak, mint látszik megvannak a maga hátrányai: elsősorban az, hogy a szöveg hosszát úgy kell megválasztani, hogy pont passzoljon egy ilyen négyzetbe (ami nekem rögtön nem is sikerült, ezért maradt benne a pont), aztán ott van még az a tény, hogy az elkódolt szövegben szerepelnek az eredeti szöveg karakterei, ezzel egy kis kiindulási alapot adva a kódfejtőknek, akik az egyes betűk gyakorisága és egyéb nyelvi jellemzők alapján el tudnak indulni (ezért lettek kivéve a szóközök és az ékezetes karakterek). No de nézzünk egy másik megoldást, ami ugyan ezen alapszik, de sikeresen gyárt teljesen olvashatatlan fájlt egy egyszerű mezei txt fájlból:

$fr = fopen('file.txt', 'r');
$fw = fopen('file-encoded.txt', 'a');

while (!feof($fr)) {
    $data = fread($fr, 8);
  if (strlen($data)) {
        if (strlen($data) !== 8) {
          $data = $data.str_repeat('0', (8 - strlen($data)));
       }
       
        $ndata = $data;

     $adata = array();

       for ($i=0;$i<8;++$i) {
          $tmp = base_convert(ord($data[$i]), 10, 2);
         if (strlen($tmp) !== 8) {
               $tmp = str_repeat('0', (8 - strlen($tmp))).$tmp;
          }
           for ($j=0;$j<8;++$j) {
              $adata[$i][$j] = $tmp[$j];
          }
       }

       $ndata = '';
      for ($i=0;$i<8;++$i) {
          $tmp = '';
            for ($j=0;$j<8;++$j) {
              $tmp .= $adata[$j][$i];
         }
           $ndata .= chr(base_convert($tmp, 2, 10));
       }

       fwrite($fw, $ndata);
    }
}
fclose($fr);
fclose($fw);

A dolog lényege a következő: megnyitjuk a fájlt és elkezdjük 8 byte-onként olvasni, ezután az olvasott karakterek ASCII kódját átváltjuk kettes számrendszerbe és kiegészítjük a kezdő nullákkal, hogy épp 8 karakter legyen, majd az egészet egy kétdimenziós tömbbe tesszük bele, valahogy így:

0 1 0 0 1 1 0 0
0 1 1 0 1 1 1 1
0 1 1 1 0 0 1 0
0 1 1 0 0 1 0 1
0 1 1 0 1 1 0 1
0 1 1 0 1 0 0 1
0 1 1 1 0 0 0 0
0 1 1 1 0 0 1 1

Ismerős a szituáció? Most már semmi más dolgunk nincs, mint kiolvasni a biteket függőlegesen, visszaváltani őket tizes számrendszerbe, majd a számnak megfelelő ascii karaktert kiírni a másik fájlba. A dolognak természetesen megvan a maga szépséghibája, méghozzá az, ha a fájl mérete nem nyolccal osztható, ilyenkor az utolsónak beolvasott X karaktert kipótolom 8-X darab nullával. Viszont természetesen megvan a dolog szépsége is. Ugyanezzel a kóddal vissza is tudjuk fejteni az elkódolt fájlt, csak a visszafejtett végén lesz (8-X) darab nulla. Emellett a szemfülesebbek észrevehették, hogy az a-z 01100001 és 01111010 közé esik, valamint az A-Z 01000001 és 01011010 közé. Tehát: csak az angol ABC betűit tartalmazó szöveg esetén a nyolcas négyzetben az első oszlop mindig csupa nulla a második pedig csupa egyes. De ha még a második oszlopot figyelmen kívül is hagyjuk, az valószínűbb, hogy az első oszlop nulla lesz, ami meg egy kódolt szövegben feltűnő lehet, hogy minden nyolcadik karakter bináris nulla.

No ennyi lenne első nekifutásra a dolog, de tervben van már, hogy beszerzek a témával kapcsolatban valami könyvet és akkor tudosítók majd komolyabb algoritmusokról is. Ja, és mégegyszer így a végre, ez a kódolás egyáltalán nem mondható biztonságosnak, mindenki csak saját felelősségére használja (vagy inkább ne használja), a deadlime.project nem tud és nem is akar felelősséget vállalni az esetleg így kiszivárgott titkok miatt. :)

Hozzáfűznél valamit?

Dobj egy emailt a blog kukac deadlime pont hu címre.

Feliratkoznál?

Az RSS feed-et ajánljuk, ha kedveled a régi jó dolgokat.