|
Szyfrowanie hasłem
27-01-2007
W tym artykule chciałbym omówić prosty algorytm służący do szyfrowania tekstu hasłem. Jest on wersją algorytmu stosowanego w czasie drugiej wojny światowej przez Niemców rozszerzoną o całą tablicę ASCII.
Szyfr ten przyporządkowuje kolejne litery hasła do kolejnych liter tekstu, który ma zostać zakodowany lub odkodowany. Hasło z reguły jest krótsze od tekstu, dlatego po ostatnim znaku hasła następuje znowu pierwszy i tak aż do przetworzenia całego tekstu. Mając dane odpowiadające sobie dwie litery dokonywana jest na nich operacja – najprościej jest po prostu wykonać XOR lub zwykłe dodawanie. My rozważymy przypadek dodawania. Należy zwrócić tutaj uwagę na dwa fakty – po pierwsze dodanie kodów dwóch znaków może dać wynik większy od 255 trzeba więc będzie na tym wyniku przeprowadzić operację modulo aby uzyskać wynik dający kod ASCII. Ponadto powinniśmy zawęzić przedział znaków do [32,255], gdyż znaki o kodach mniejszych od 32 należą do znaków sterujących i mogą powodować niepowołane efekty. Z tego wynika że uzyskanie znaku wynikowego wymaga odjęcia 32 od kodów znaków tekstu oraz hasła, dokonania operacji mod 224 (tyle zostaje po usunięciu znaków sterujących) i dodania 32 do wyniku aby w tekście zaszyfrowanym uzyskać kod znaku nadającego się do wyświetlenia. Te operacje realizuje poniższa funkcja:
żródłem tekstu jawnego jest memo1, hasło znajduje się w polu edit1, natomiast zaszyfrowany tekst będzie się znajdywał w memo2.
procedure TForm1.Button1Click(Sender: TObject);
var i:integer;
s:string;
z,c:char;
begin
s:='';
for i:=1 to length(memo1.text) do begin
z:=memo1.text[ i ] ;
c:=edit1.text[(i-1) mod length(edit1.text) +1]; //zapewniamy “zapętlenie” hasła
z:=chr((ord(z)-32+ord(c)-32) mod 224 + 32); // szyfrujemy
s:=s+z;
end;
memo2.text:=s;
end;
Analogicznie przebiega proces dekodowania:
procedure TForm1.Button2Click(Sender: TObject);
var i:integer;
s:string;
z,c:char;
begin
s:='';
for i:=1 to length(memo2.text) do begin
z:=memo2.text[ i ];
c:=edit1.text[(i-1) mod length(edit1.text) +1];
z:=chr((ord(z)-ord(c))mod 224 +32 );
s:=s+z;
end;
memo1.text:=s;
end;
|