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

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 !!!.

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.

a zaszyfrowanie ciżgu znaków: [email protected]
bedzie wyglądać: @@@@@
po odzyfrowaniu otrzymamy: AAAAA

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.

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

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

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 .

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ć...