Kódoló írása C#-ban

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

7 HOZZÁSZÓLÁS

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

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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    
    			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

HOZZÁSZÓLOK A CIKKHEZ

Kérjük, írja be véleményét!
írja be ide nevét