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:

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:

static string jelszo;
static string kodolni_szoveg;

Csináljunk értéket adó metódust, amely az előző változóknak értéket ad:

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:

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:

	int[] KodSzoveg = new int[kodolni_szoveg.Length];

Az előbb létrehozott tömbbe típuskényszerítéssel belerakjuk az ASCI kódokat:

	KodSzoveg[i] = (int)kodolni_szoveg[i];

Ugyanezt, ugyanígy a jelszóval is megcsináljuk:

	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:

	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…)

	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:


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:

<?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 */
Harder

Harder

Profil

Korábbi hozzászólások (7)

A régi blogon érkezett hozzászólások archívuma. Új hozzászólást már nem lehet írni.

  1. mex

    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

  2. terbedwww.terbed.host56.com

    Igen maximálisan egyetértek veled mex

  3. Icebob

    É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.

  4. BlackY

    (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)

    int[] CodeText = new int[coding_text.Length];

    CodeText[i] = (int)coding_text[i];

    int[] CodePassword = new int[coding_text.Length];

    CodePassword[i] = (int)password[i];

    int[] XOR_code = new int[coding_text.Length];

    XOR_code[i] = CodeText[i] ^ CodePassword[i];

    char[] XOR_character = new char[coding_text.Length];

    XOR_character[i] = (char)XOR_code[i];

    Console.Write(XOR_character[i]);

    BlackY

  5. Festo

    Hy. A php-nél a záró sor lemaradt. Tudom mellékes csak szólok =)

  6. csharpli

    Itt egy kis frissítés:
    http://csharplibrary.com/progmat/progmat/285-xor-ligikan-alapulo-kodolo.html?start=1

  7. MarfXDwww.marfxd.tumblr.com

    Nagyon jó a kódoló! :D A Dekódolót is felraknád ? kérlek

Van hozzáfűznivalód? Írj nekem közvetlenül.

Kapcsolat