Programowanie w języku Delphi » Artykuły

Szyfrowanie plików

  • 2006-01-05 15:24
  • 8 komentarzy
  • 1132 odsłony
  • Oceń ten tekst jako pierwszy
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

payl 2009-11-30 14:13

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  .

bordeux 2007-09-16 16:26

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

Rave 2006-09-08 19:38

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

deadmanstillwalking 2006-07-24 11:13

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

blacksheep.91 2006-07-02 08:06

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.

ird 2005-07-25 09:20

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

z1mEk 2005-04-22 22:04

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.

kin! 2004-04-06 10:57

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