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