Kodowanie tekstu za pomocą kodów ASCII o zmiennym kodzie

szartur

Artykuł o tym jak bardzo łatwo można zaszyfrować tekst wykorzystując kod ASCII. Jest to mój pierwszy artykuł a tak poza tym to delphi bawię się dopiero od kilku dni, więc proszę o wyrozumiałość jakbym popełnił jakiś błąd.
Artykuł przeznaczony jest dla początkujących, ale może się przydać również zaawansowanym programistom.
Widziałem bardzo dużo artykułów na temat szyfrowania tekstu - jedne były lepsze drugie gorsze. Niektóre zwiększały plik tekstowy dwukrotnie, inne trzykrotnie, widziałem nawet pomysł, w którym plik zwiększał rozmiar aż sześciokrotnie.
Przy opracowaniu metody kodowania kierowałem się tym, aby plik nie zwiększał swojego rozmiaru po zakodowaniu i żeby klucz szyfrowy był dynamiczny - zmieniający się w czasie kodowania.
Opracowałem, więc metodę polegającą na szyfrowaniu tekstu znak po znaku, ale uzależnioną od długości linii tekstu.
Kodowany znak ma zwiększany kod ASCII o liczbę, którą nazwałem "klucz" i potem zmniejszany o liczbę znaków danej linii - liczbę tą nazwałem "kod".
W moim przykładzie liczba klucz równa się 50, a liczba kod przyjmuje wartość równą długości linii zaś w przypadku linii zawierającej ponad 49 znaków liczbę 49.
Kodowany znak będzie w związku z tym zwiększany od 1 do 49 według kodu ASCII. Dla różnej długości linii będzie przyjmował różną wartość.
Żeby zobaczyć jak to wygląda w praktyce należy wrzucić na Forme trzy pola Memo oraz dwa przyciski Button.
Z lewej strony umieść Memo1 potem Button1 następnie Memo2, Button2 i na końcu z prawej Memo3.
Do Memo1 będziemy wpisywali tekst, po naciśnięciu przycisku Button1 będzie on kodowany do Memo2 a po naciśnięciu Button2 tekst z Memo2 będzie rozkodowany do Memo3.
Kliknijmy Button1 i utwórzmy procedurę

procedure TForm1.Button1Click(Sender: TObject);
var
  tekst: String;                  //zmienna przechowująca kodowany tekst
  i, j: Integer;
  liter: Integer;                 //ilość znaków w linii
  klucz: integer;                 //klucz
  kod: Integer;                   //kod
  element: Integer;               //ilość linii
begin
Memo2.Clear;                      //kasowanie zawartości Memo2
klucz:=50;                        //nadanie klucz wartości 50
element:=Memo1.Lines.Count;       //iloścć wierszy w Memo1
for i:=0 to element-1 do
  begin
  liter:=Length(Memo1.Lines[i]);  //ilość znaków w danej linii
  SetLength(tekst, liter);        //ustalenie długości zmiennej tekst
  if liter>49 then kod:=49        //ustalenie wartości zmiennej kod
  else kod:=liter;
for j:=1 to liter do tekst[j]:=chr(ord(Memo1.Lines[i][j])+klucz-kod);                             //kodowanie
  Memo2.Lines.Add(tekst);         //dodanie do Memo2 zakodowanej linii
  end;
end;

Następnie klikamy Button2 i tworzymy procedurę odkodowania

procedure TForm1.Button2Click(Sender: TObject);
var
  tekst: String;
  i, j: Integer;
  liter: Integer;
  klucz: integer;
  kod: Integer;
  element: Integer;
begin
Memo3.Clear;
klucz:=50;
element:=Memo2.Lines.Count;
for i:=0 to element-1 do
  begin
  liter:=Length(Memo2.Lines[i]);
  SetLength(tekst, liter);
  if liter>49 then kod:=49
  else kod:=liter;
  for j:=1 to liter do tekst[j]:=chr(ord(Memo2.Lines[i][j])-klucz+kod);
  Memo3.Lines.Add(tekst);
  end;
end;

Procedura odkodowania różni się tym, że odczytuje tekst z Memo2 a zapisuje w Memo3 oraz tym ze od wartości znaku odejmowana jest wartość klucz a dodawana kod.
Wartość klucz i kod można ustawić według własnych upodobań, lecz nie można przesadzić - znak ASCII musi zawierać się w przedziale 0-255. Najbezpieczniej jest nie zwiększać wartości klucz powyżej 128.
W załączniku umieszczam program wraz ze źródłem.
Życzę milej zabawy.

9 komentarzy

W typie Byte gdy jest liczba ujemna zawsze liczy od 255 w dół! Tak samo z dodawaniem!!!

on sobie nie radzi poniewaz:

znak o kodzie 230 [Š] zostanie zakodowany jako 280 [?] przy kluczu 50 [2] a system
automatycznie zamienia to na 280-256 czyli wyjdzie znak o kodzie 24 [?] a po odkodowaniu wyjdzie znak o kodzie -26 czego system nie jest w stanie obsluzyc

2 przykład
{240}{485}Kraków wrzesień 1939 roku
szkoda gadać, ale radzi se tylko z literami :(

Fajne, ale nie działa...
Memo1:15C15C83C827FA99D67F44F4386FFA
[koduj]
Memo2:GKYGKYNIYNHM\WOOZLM\JJ\JINL\
vq
[dekoduj]
Memo3:/3A/3A61A605D?77B45D22D216
,

wszystko to opiera sie na wektorowych przesunieciach po siatce kodow ascii. i mozna poradzic sobie z tym nawet bez programu szyfrujacego (majac zaszyfrowany sam tekst) - kwestia czasu.

Nie jest to wcale tak łatwo rozkodować jak się nie zna procedury.

To sie wlacza disasm i sie ma :|

Fajny artykuł! Bardzo prosta metoda a jednak bardzo skuteczna. Dla mnie bomba. Pozdrawiam autora

takie proste ze az glupie :P

Ma być proste! Po co sobie komplikować. Niby prosta procedura ale wcale nie jest to tak łatwo odkodować. Np:
Litera "A" po zakodowaniu ma postać "r"
Zaś tekst "AA" ma "qq" - niby ten sam znak ale przyjmuje różną wartość dla różnej długości tekstu. Nie jest to wcale tak łatwo rozkodować jak się nie zna procedury.
Pozatym jeśli uważasz że to takie proste to czemu sam na coś takiego nie wpadłeś?