|
|
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...
C≤┐, nazwa nie m≤wi wiele. W Pascalu ( w Turbo Pascalu jak i w Delphi ) wykorzystana jest do tego procedura XOR. Oops, sorki nie jest to procedura, ale operator! Operuje on na bitach. Mo┐esz wiΩc zapisaµ tak:
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:
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µ. Listing 11.1 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.
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. 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.
|
|
|