Szyfrowanie
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 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.
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.
Wszystko fajnie, tylko trzeba zmienić:
PassCount := 1;
oraz
if PassCount > Length(Password) then PassCount := 1;
bo string w zerowym elemencie trzyma długość