Kodowanie
Adam Boduch
Kodowanie wcale nie musi być tak trudne. Podstawą programu kodującego musi być algorytm szyfrujący jakieś dane. Zabezpieczone to musi być hasłem tak, aby szyfrowane słowo + hasło równało się zakodowany tekst. Pierwsza metoda kodowania...
Metoda xorowania
Cóż, nazwa nie mówi wiele. W Pascalu (w Turbo Pascalu jak i w Delphi) wykorzystana jest do tego operator XOR. Operuje on na bitach. Możesz więc zapisać tak:
Wynik := 20 xor 5;
Tak więc do zmiennej Wynik zapisaliśmy wynik xorowania liczby 20 przez 5. Co to właściwie znaczy? Otóż systemy operują systemem dwójkowym - same zera lub jedynki. W naszym przypadku liczba 20 może być liczbą, którą chcemy zaszyfrować, a cyfra 5 może być hasłem. Tak jak powiedziałem system operuje na systemie zer i jedynek (binarnym). Możemy więc zapisać w postaci binarnej tak:
20 = 1110000
5 = 0001111
Xorowanie to zestawianie tych zer i jedynek. Jeżeli dwa porównywane bity są takie same to rezultat będzie w postaci cyfry 0. [ jeżeli bit 1 = 0 oraz bit 2 = 0 to wynik będzie cyfrą 0 ). W przeciwnym wypadku ( jeżeli dwa porównywane typy będą różne ) rezultatem będzie cyfra 1.
Oto przykład zaszyfrowania ( xorowania ) liczby 20:
var
X, Y, Z : Integer;
begin
X := 20; // kodowana liczba
Y := 5; // hasło
Z := X xor Y;
Zmienna Z będzie zawierać liczbę 17. Żeby to teraz rozszyfrować należy przestawić parametry.
var
X, Y, Z : Integer;
begin
Z := 17; // wynik - Z
Y := 5; // hasło
X := Z xor Y; // <-- szukany parametr X
Zmienna X będzie zawierać liczbę 20. Trochę trudniej ma się sprawa z wartościami w postaci zmiennych tekstowych. Tutaj bowiem należy każdą literę przekształcić do postaci liczby, a następnie zexorować.
function Szyfruj(sString, Password : String) : String;
var
I : Integer;
PassCount : Integer;
begin
PassCount := 0;
Result := sString; // przypisz wartosc poczatkowa
for I := 1 to Length(sString) do // wykonuj dla kazdej litery osobno
begin
{
Dla kazdego osobnego znaku zamieniaj na wartosc liczbowa, a nastepnie
xoruj z kazda litera hasla - powstaje wowczas unikalna kombinacja.
}
Result[i] := Chr(Ord(sString[i]) xor Ord(Password[PassCount]));
Inc(PassCount); // wieksz licznik - kolejne slowo hasla
{ Jezeli licznik przekroczy dlugosc hasla - wyzeruj }
if PassCount > Length(Password) then PassCount := 0;
end;
end;
Tak jak mówiłem z tekstem jest trochę trudniej. W tym wypadku pętla każdy znak tekstu porównuje ze znakiem hasła.
Metoda odejmowania
To o wiele prostsza metoda - polega na odejmowaniu od liczby 255 numeru znaku. Liczba 255 to największa liczba jaką może przyjąć jeden bajt. Mówiąc inaczej każdy znak ma swój numer ASCII.
( numery wszystkich klawiszy możesz poznać ściągając choćby malutki programik ASCII ).
Możesz np. oprogramować zdarzenie OnKeyPress, które występuje po naciśnięciu klawisza. Oto procedura:
procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
begin
ShowMessage(
Format('Zakodowany znak: %s to %d', [Key, 255 - Ord(Key)]));
end;
Istnieje jeszcze jedna metoda ( najbardziej czasochłonna ) polegająca na oprogramowaniu każdego znaku. Znaczy to, że my opisujemy jakim znakiem ma program zastąpić określony znak tekstu.
Artykuł o tym znajdziesz w dziale Delphi.
dzieki tego szukalem :D
hmm może raczej
20 = 00010100
5 = 00000101
00010100 xor 00000101 = 00010001
00010001 = 17
Czegoś tu nierozumiem.
Od kiedy zachodzą takie równania??:
20 = 1110000
5 = 0001111
no całkiem, całkiem...
Xora już znam ale tu jest nieźle wyjaśniony.