Programowanie w języku Delphi » Gotowce

Szyfrowanie

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 procedura XOR. Oops,
sorki nie jest to procedura, ale operator! 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.

2 komentarze

maxiu1989 2012-08-11 23:46

Nie wiem ale mi działa kod podany przez Autora, z jedynkami wiadomość po rozszyfrowaniu jest urwana :/
Dla dlugich wiadomosci i hasel kompletnie sie wysypuje. Myślę że jest to spowodowane tym że do pliku INI zapisuje mi sie znak nowej linii i wartosc poddana deszyfrowaniu jest juz inna.

zefir 2012-06-07 15:57

Wszystko fajnie, tylko trzeba zmienić:
PassCount := 1;
oraz
if PassCount > Length(Password) then PassCount := 1;

bo string w zerowym elemencie trzyma długość