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
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.
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)
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
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
Van hozzáfűznivalód? Írj nekem közvetlenül.
Kapcsolat