Azt tudni kell, hogy sok módon meg lehet írni egy programot. A mi feladatunk az, hogy kiválasszuk közülük a leghatékonyabbat. A mi kódolónk jelen esetben egy XOR-os lesz. Ami azt jelenti, hogy a szöveget át kell alakítanunk kóddá (az ASCI kódjává) és azt a megadott jelszóval XOR-ozzuk.
Az XOR elmélete:
1 2 3 4 5 6 | A B C 0 0 0 0 1 1 1 0 1 1 1 0 (C = A Xor B) |
A dekódolónál ugyan ez a helyzet, csak éppen visszafelé. Tehát a kódot a jelszóval XOR-ozzuk és azt visszaalakítjuk karakterekké. Így visszanyerjük az eredeti szöveget, vagyis a kódoló és a dekolódoló megegyezik.
Én most a kódoló megírását mutatom be. Most statikus osztályként csinálom, persze meg lehetne csinálni akár származtatva is…
Kezdjünk is hozzá. Először vezessünk be két változót, az egyikbe a kódolni kívánt szöveget, a másikba a jelszót fogjuk tárolni:
1 2 | static string jelszo; static string kodolni_szoveg; |
Csináljunk értéket adó metódust, amely az előző változóknak értéket ad:
1 2 3 4 5 6 7 | static void AddValue() { Console.WriteLine("\nIrja be a kodolni kivant szoveget:"); kodolni_szoveg = Console.ReadLine(); Console.WriteLine("Irja be a jelszot:"); jelszo = Console.ReadLine(); } |
Most jön a neheze. Most csináljuk meg a program szívét, a kódolót.
Először csinálni kell egy for ciklust, amely végigpörgeti a kódolni kívánt szöveg karaktereit betűröl betűre:
1 | for (int i = 0; i < kodolni_szoveg.Length; i++) |
Ezután létre kell hoznunk egy tömböt, amely a kódolni kívánt szöveg karaktereinek ASCII kódját fogja tartalmazni:
1 | int[] KodSzoveg = new int[kodolni_szoveg.Length]; |
Az előbb létrehozott tömbbe típuskényszerítéssel belerakjuk az ASCI kódokat:
1 | KodSzoveg[i] = (int)kodolni_szoveg[i]; |
Ugyanezt, ugyanígy a jelszóval is megcsináljuk:
1 2 | int[] KodJelszo = new int[kodolni_szoveg.Length]; KodJelszo[i] = (int)jelszo[i]; |
Most elvégezzük a két ASCI kód között az xor-t:
1 2 | int[] XOR_kod = new int[kodolni_szoveg.Length]; XOR_kod[i] = KodSzoveg[i] ^ KodJelszo[i]; |
Most pedig létrehozunk egy tömböt, melybe aztán belerakjuk a megXORozott ASCI kód string alakját (pl.: 65 -> a stb…)
1 2 | char[] XOR_karakter = new char[kodolni_szoveg.Length]; XOR_karakter[i] = (char)XOR_kod[i]; |
Tehát mostmár értjük a kód szerkezetét. Bemásoltam ide az egész kódot. (az alábbi elmélkedés alapjaiból felépítve) Persze ezt 1001 módon meg lehetett volna oldani, én most így csináltam:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 | using System; namespace www.supertutorial.hu { static class StaticFullClass { static string password; static string coding_text; static void AddValue() { Console.WriteLine("\nIrja be a kodolni kivant szoveget:"); coding_text = Console.ReadLine(); Console.WriteLine("Irja be a jelszot:"); password = Console.ReadLine(); } static void encoding() { Console.WriteLine("A szoveg le lett kodolva:\n"); int[] CodeText = new int[coding_text.Length]; int[] CodePassword = new int[coding_text.Length]; int[] CodePassword = new int[coding_text.Length]; char[] XOR_character = new char[coding_text.Length]; for (int i = 0; i < coding_text.Length; i++) { CodeText[i] = (int)coding_text[i]; CodePassword[i] = (int)password[i]; XOR_code[i] = CodeText[i] ^ CodePassword[i]; XOR_character[i] = (char)XOR_code[i]; Console.Write(XOR_character[i]); } } static void FullProg() { try { string exit; do { Console.WriteLine("\n\n\nEz a program XOR-osan kodol."); AddValue(); encoding(); Console.WriteLine("\n\nHa ki akar lepni usse be hogy 'kilepes', ha nem irja be, hogy 'nem'!"); exit = Convert.ToString(Console.ReadLine()); } while (exit != "kilepes"); } catch (Exception ex) { Console.WriteLine("Hiba!" + ex); } } static void Main() { FullProg(); } } } |
Letöltés: xor-kodolo.exe (6kb)
Módosítva: BlackY
És ugyanezen az elven működő kódoló PHP-ban:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | <?php define('BUFFER_SIZE', 4096); /* Az olvasó puffer mérete */ /* Néhány ellenőrzés */ if(!isset($argv[1]) || !isset($argv[2]) || !isset($argv[3])) { echo 'Hasznalat: php phpxor.php <kulcsfajl> <inputfajl> <outputfajl>'; exit(1); } if(!file_exists($argv[1]) || !is_readable($argv[1])) { echo 'A kulcs fajl nem talalhato'; exit(1); } if(!file_exists($argv[2]) || !is_readable($argv[2])) { echo 'Az input fajl nem talalhato'; exit(1); } if(file_exists($argv[2]) && !is_writable($argv[3]) && !is_writable(dirname($argv[3]))) { echo 'A kimeneti fajl nem irhato'; exit(1); } /* Minden oké, kezdhetünk */ $key = file_get_contents($argv[1]); /* A kulcs fájl ne legyen túl nagy, mert az végig a memóriában marad */ $fi = fopen($argv[2], 'rb'); /* Megnyitjuk a bemeneti fájlt - bináris módban! */ $fo = fopen($argv[3], 'wb'); /* Megnyitjuk a kimeneti fájlt - bináris módban! */ $keyPos = 0; /* Beállítjuk az aktuális kulcs pozíciót 0-ra */ $keyLen = strlen($key); /* Eltároljuk egy változóban a kulcs hosszát (elég egyszer lekérdezni) */ while($chunk = fgets($fi, BUFFER_SIZE)) { /* BUFFER_SIZE méretű darabokban olvasgatjuk a bemeneti filet */ $chunkSize = strlen($chunk); /* Megnézzük, mennyit tudtunk beolvasni */ for($i = 0; $i < $chunkSize; $i++) { /* Aztán végigrohanunk 0-tól a fenti értékig */ $chunk{$i} = $chunk{$i} ^ $key{$keyPos}; /* Elvégezzük az átalakítást */ $keyPos = ++$keyPos == $keyLen ? 0 : $keyPos; /* Növeljük modolu keyLen a pozíciót */ } fwrite($fo, $chunk); /* És kivéssük a kimeneti fájlba */ } fclose($fi); fclose($fo); exit(0); /* Nulla hibakóddal lépünk ki, jelezve, hogy hibátlanul lefutottunk */ |
Néhány észrevétel:
– XOR-nál a kódoló egyben dekódoló is.
– Azt még jó lenne lekezelni, ha a szöveg meg a jelszó különböző hosszúságú (pl. ha a jelszó rövidebb, akkor annyiszor ismételni míg el nem éri a szöveg hosszát).
– Az ASCI-t is jó lenne javítani ASCII-re.
– Jó lenne a kódot tabulálni, a könnyebb olvashatóságért.
Amúgy jó ötlet, hogy ilyen jellegű programkódok is felkerülnek a tutorial.hu-ra.
Aki érdeklődik a C# iránt, annak íme itt egy ingyenes e-book:
http://www.tothetech.com/blog/free-downloads/ebook/free-illustrated-c-2008-ebook.html
Igen maximálisan egyetértek veled mex
Én is örömmel látom, hogy programozással kapcsolatos tutorok is kerülnek fel, remélem idővel egyre több :)
Egy dolgot jegyeznék meg a XOR kódoláshoz, hogy anno mikor ilyet használtam (keyfile kódoláshoz), akkor én még annyival „bolondítottam” meg az egészet, hogy a következő bájt kódolásánál nem csak a jelszó megadott karakterét használtam, hanem az előzőleg bekódolt bájtot is. Azért, mert ha a keyfileban, mondjuk egy ‘user’ számot átírtam 5ről 10-re, akkor mindössze a bekódolt fájlba is csak egyetlen egy bájt változott, és így könnyű volt kideríteni, mivel kell próbálkozni. Így viszont a módosult bájt után következő összes bájt is módosul a bekódolt stringben.
(Az eredeti ciklusmagot csak azért másolom be ide, mert mindjárt belejavítok a kódba, működik, csak nem épp memória-barát ciklusban tömböket lefoglalni)
BlackY
Hy. A php-nél a záró sor lemaradt. Tudom mellékes csak szólok =)
Itt egy kis frissítés:
http://csharplibrary.com/progmat/progmat/285-xor-ligikan-alapulo-kodolo.html?start=1
Nagyon jó a kódoló! :D A Dekódolót is felraknád ? kérlek