Szyfrowanie plików

Adam Boduch

To pojęcie nie jest skomplikowane tak jak by się to mogło wydawać na pierwszy rzut oka :) ale jest dość czasochłonne. Wymaga bowiem zaprogramowania każdego znaku. Tj. na jaki znak ma program zmieniać np. literkę "a".

Najlepiej na formularzu umieść dwa komponenty typu Memo oraz dwa Buttony. W pierwszym Memo będzie umieszczony tekst do zakodowania, a w drugim zakodowany już tekst. Jeden przycisk będzie służył do kodowania, a drugi do dekodowania.

var
  S : String;
  Len : Integer;
  I : Integer;
  Code : String;
begin
  S := Memo1.Lines.Text;
  Len := Length(S);// pobierz długość tekstu

  for I := 1 to Len do  // pętelka
  begin
  { Jeżeli w skład Memo1 wchodzi dużą litera "A" lub małą
    litera "a" to do zmiennej "Code" przypisywany jest znak
    "@", który jest znakiem kodowania, który odpowiada tejże
    literze. }
    if (S[i] = 'A') or (S[i] = 'a') then
      Code := Code + '@';
    if (S[i] = 'B') or (S[i] = 'b') then // j/w
      Code := Code + '^';
    if (S[i] = 'C') or (S[i] = 'c') then  // j/w
      Code := Code + '2';
  end;
  Memo2.Clear; // wyczyść drugie Memo
  Memo2.SelText := Code; // wstaw tekst ze zmiennej "Code"
end;

Procedura nie jest długa, ale koduje tylko trzy znaki :) a konkretniej litery a, b, c. W tej procedurze nie będą rozpoznawane znaki dużej litery, czy małej. Później zmiennej "Code" dopisujemy kolejny "skodowany" znak. Na samym koću Memo2 jest czyszczone i przypisywana jest mu zmienna "Code". Oczywiście w ten sposób musisz zaprogramować każdy znak ( mówiłem, że to czasochłonne?! :)).

No dobra teraz schemat dekodowania, a konkretniej zawartości Memo2.

var
  S : String;
  Len : Integer;
  I : Integer;
  Code : String;
begin
  S := Memo2.Lines.Text;
  Len := Length(S);

  for I := 1 to Len do
  begin
    if S[i] = '@' then
      Code := Code + 'a';
    if S[i] = '^' then
      Code := Code + 'b';
    if S[i] = '2' then
      Code := Code + 'c';
  end;
  Memo1.Clear; // czyść
  Memo1.SelText := Code; // przypisz zmienna "Code" do 
 //zawartości Memo1

end;

Ta procedura jest bardzo podobna do poprzedniej. Działa na tej samej zasadzie co poprzednia. Cóż mogę jeszcze powiedzieć? Może jak zapisać treść Memo do pliku:

var
  TF : TextFile;
begin
  AssignFile(TF, 'C:plik.txt');
  Rewrite(TF);
  Writeln(TF, Memo1.Lines.Text);
  CloseFile(TF);

Jeżeli chcecie wiedzieć coś więcej o zapisie i odczycie plików przeczytajcie artykuł "Pliki".

Na tym kończę ten krótki artykuł.

8 komentarzy

Ten algorytm jest do bani ;) . Nada się do szyfrowania tylko w prostej aplikacji, której nikt nie będzie próbować złamać. Co do porządnego szyfrowania polecam http://www.cityinthesky.co.uk/cryptography.html .

C:plik.txt chanage C:\plik.txt

Można też to zrobić na tablicach.

[code]
const
ARRCOUNT = 3
znaki : array [0..2] of string = ('a','s','d'); // tutaj dałem dla 3 elementów, ale można dla więcej...
szyfrznaki : array [0..2] of string = ('lala','kocha','sxda');
[/code]

Procedura szyfrująca:
[code]
var i,j,len: int64;
s, code : string;
S := Memo2.Lines.Text;
Len := Length(S);
begin
i:=0;
j:=0;

for i:=0 to 2 do
begin
for j := 1 to Len do
begin
if S[i] = znaki[i] then
Code := Code + szyfrznaki[i];
end;
end;
Memo1.Clear; // czyść
Memo1.SelText := Code; // przypisz zmienna "Code" do zawartości Memo1
end;
[/code]

Procedura deszyfrująca:
[code]
var i,j,len: int64;
s, code : string;
S := Memo2.Lines.Text;
Len := Length(S);
begin
i:=0;
j:=0;

for i:=0 to 2 do
begin
for j := 1 to Len do
begin
if S[i] = szyfrznaki[i] then
Code := Code + znaki[i];
end;
end;
Memo1.Clear; // czyść
Memo1.SelText := Code; // przypisz zmienna "Code" do zawartości Memo1
end;
[/code]

Oczywiście trzeba to dopracować...

jak sobie chcecie skomplikowane szyfrowanie robić to zobaczcie w wikipedii RSA

Algorytm nie jest taki łatwy do rozszyfrowania szczególnie dlatego że nie trzeba zamieniać tego na litery tylko na cyfry np. a = 246 wtedy kazdy znak ma trzy cyfry, algorytm dekodowania bedzie uwzglednial wszystkie trzy przez co dekodowanie nie jest problemem. Dodatkowo odwracając ciąg zanków zyskujemy bardzo efektowny i cężki do rozszyfrowania algorytm. Pozdrawiam.

a zaszyfrowanie ciżgu znaków: AA@AA
bedzie wyglądać: @@@@@
po odzyfrowaniu otrzymamy: AAAAA

Zastępowanie litery jakimś innym znakiem to żadne szyfrowanie, złamać można to bardzo szybko. Pewnie łatwiej niż rozwiązać krzyżówkę "Jolkę".
Ten sposób programowania jest paskudny, załatwianie tego if - ami jest trochę toporne.

ps. Programowanie jest jak śpiew czy malarstwo - nie każdy się do tego nadaje.

niezbyt ladny algorytm szyfrowania..
Odbiorca coprawda nie musi posiadac klucza, ale w bardzo latwy sposob mozna zlamac powyzszy szyfr. Znaczny leprzy efekt uzyskalibysmy stosujac szyfr Cezara, lub Hornera. Najprostrzy algorytm zajmowalby gora jeden ekran !!!.