Algorytmy

Kodowanie

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.

5 komentarzy

Misiek__ 2005-11-07 13:04

dzieki tego szukalem :D

Rudolf 2005-10-01 20:44

hmm może raczej
20 = 00010100
5  = 00000101

00010100 xor 00000101 = 00010001
00010001 = 17

Juhas 2004-11-23 15:55

Czegoś tu nierozumiem.
Od kiedy zachodzą takie równania??:
20 = 1110000
5  = 0001111

tomksoft 2004-04-11 18:51

no całkiem, całkiem...

szprota 2004-01-24 12:24

Xora już znam ale tu jest nieźle wyjaśniony.