3.1 Procedura szyfrowania
Procedura szyfrowania pracuje w trzech trybach:
Pierwszym trybem jest szyfrowanie z jednym kluczem dla każdego bloku szyfrogramu, polega ona na tym iż każdy wektor tekstu jawnego wraz z elementami nadmiarowymi szyfrowany jest za pomocą tego samego klucza. Schemat działania pokazano poniżej:
K - klucz, (M1,...,Mn) - kolejne bloki wiadomości, (C1,...,Cn) - kolejne bloki kryptogramu,
Drugim trybem je szyfrowanie z kluczem losowym dla każdego bloku szyfrogramu, tryb polega na każdorazowym losowaniu klucza dla każdego bloku szyfrogramu. Klucz jest losowany na podstawie hasła użytkownika. Schemat działania pokazano poniżej:
(K1,...,Kn) - wygenerowane klucze , (M1,...,Mn) - kolejne bloki wiadomości, (C1,...,Cn) - kolejne bloki kryptogramu,
Trzecim trybem jest sprzężenie bloków kryptogramu, polega na tym , że wszystkie kolejne bloki kryptogramu są ze sobą powiązane - każdy blok tekstu jawnego jest szyfrowany z poprzednim blokiem kryptogramu. Pierwszy blok tekstu jawnego jest natomiast szyfrowany z losowym wektorem inicjalizującym. Schemat działania pokazano poniżej:
K - klucz inicjujacy , (M1,...,Mn) - kolejne bloki wiadomości, (C1,...,Cn) - kolejne bloki kryptogramu,
Ogólny schemat działania procedury szyfrującej:
Procedura wykonująca szyfrowanie:
Przykład szyfrowania:
Wiadomość:
Wiadomość wraz z bajtami korekcji:
Permutacja:
Wiadomość po permutacji :
Klucz:
Blok kryptogramu:
M1
K
C1
C2
K
M2
Cn
K
Mn
K1
M1
...
C1
M2
K2
C2
Mn
Kn
Cn
...
M1
K
M2
C1
C2
Mn
Cn-1
Cn
...
C1
Cn-1
Odczyt danych z pliku wiadomości i obliczenie wektora z elementami nadmiarowymi
Odczyt hasła użytkownika
Wygenerowanie klucza początkowego i permutacji
Szyfrowanie bloków danych według wybranego trybu pracy
Zapis bloku szyfrogramu do pliku
Zakończenie szyfrowania
Koniec pliku = tak
Koniec pliku = nie
procedure Szyfruj_.Execute;
type
Plist = ^lista;
lista = record
bajt: byte;
end;
var
wekpom: TList;
tabpom: Plist;
i,j,q,pom,pom2,errpom:integer;
pom1,index: byte;
rozmiar:int64;
koniec,ziarno:longint;
bufor: array [1..255] of Byte;
bufzapis,per,perk: array [1..255] of Byte;
odp:boolean;
haslo:string;
begin
odp:=true;
if FileExists(Form1.Edit2.Text) then
if MessageDlg('Taki kryptogram istnieje. Czy chcesz go zapisać?',mtConfirmation, [mbYes, mbNo], 0) = mrNo then odp:=false;
{--------------------------------------------------------------------}
haslo:=Form1.MaskEdit2.Text;
ziarno:=0;
for i:=1 to SizeOf(haslo) do ziarno:=ziarno+Round(Ord(haslo[i])/i);
RandSeed:=ziarno;
for i:=1 to 255 do
begin
klucz[i]:=Random(255)+1;
end;
wekpom := TList.Create;
for i:=1 to 255 do
begin
New(tabpom);
tabpom^.bajt:=i;
wekpom.Add(tabpom);
end;
RandSeed:=ziarno;
for i:=1 to 255 do
begin
pom:=Random(wekpom.Count);
tabpom:=wekpom.Items[pom];
permut[i]:=tabpom^.bajt;
wekpom.Delete(pom);
end;
wekpom.Destroy;
{--------------------------------------------------------------------}
AssignFile(dane,ExtractFileDir(Application.ExeName)+'\mno.dat');
FileMode := 0;
Reset(dane);
SetLength(dane1,256);
for i:=0 to 255 do
begin
SetLength(dane1[i],256);
for j:=0 to 255 do
begin
BlockRead(dane,pom1,1);
dane1[i,j]:=pom1;
end;
end;
CloseFile(dane);
{-------------------------------------------------------------------}
if odp=true then
begin
Form1.Button1.Enabled:=False;
Form1.Button2.Enabled:=False;
Form1.Button4.Enabled:=False;
Form1.Button5.Enabled:=False;
Form1.Otwrz1.Enabled:=False;
Form1.Szyfruj1.Enabled:=False;
Form1.Edit1.Enabled:=False;
Form1.Edit2.Enabled:=False;
Form1.MaskEdit1.Enabled:=False;
Form1.MaskEdit2.Enabled:=False;
n:=255;
r:=130;
k:=125;
err:=65;
AssignFile(wiad,Form1.Edit1.Text);
Reset(wiad);
rozmiar:=FileSize(wiad);
Form1.Gauge1.MaxValue:=rozmiar;
koniec:=(rozmiar div k)*k;
AssignFile(krypto,Form1.Edit2.Text);
ReWrite(krypto);
RSgen(r);
{------------------------------------------------------------}
BlockWrite(krypto,rozmiar,SizeOf(rozmiar));
index:=Form1.RadioGroup1.ItemIndex;
BlockWrite(krypto,index,SizeOf(index));
RandSeed:=ziarno;
while (FilePos(wiad)<koniec) do
begin
BlockRead(wiad,bufor,k);
j:=1;
For i:=n-1 downto r do
begin
v[i]:=bufor[j];
inc(j);
end;
Encode(n,r);
for i:=1 to 255 do bufzapis[i]:=v[n-i];
{----------------------------------------------------------------}
case Form1.RadioGroup1.ItemIndex of
0:begin
for i:=1 to 255 do
begin
per[i]:=bufzapis[permut[i]];
perk[i]:=S(per[i],klucz[i]);
end;
end;
1:begin
for i:=1 to 255 do klucz[i]:=Random(255)+1;
for i:=1 to 255 do
begin
per[i]:=bufzapis[permut[i]];
perk[i]:=S(per[i],klucz[i]);
end;
end;
2:begin
for i:=1 to 255 do
begin
per[i]:=bufzapis[permut[i]];
perk[i]:=S(per[i],klucz[i]);
end;
for i:=1 to 255 do klucz[i]:=perk[i];
end;
end;
BlockWrite(krypto,perk,SizeOf(perk));
Form1.Gauge1.Progress:=FilePos(wiad);
end;
{--------------------------------------------------------------------}
if rozmiar>125 then
begin
for i:=1 to 255 do bufor[i]:=255;
BlockRead(wiad,bufor,(rozmiar-koniec));
j:=1;
for i:=n-1 downto 1 do
begin
v[i]:=bufor[j];
inc(j);
end;
Encode(n,r);
for i:=1 to 255 do bufzapis[i]:=v[n-i];
case Form1.RadioGroup1.ItemIndex of
0:begin
for i:=1 to 255 do
begin
per[i]:=bufzapis[permut[i]];
perk[i]:=S(per[i],klucz[i]);
end;
end;
1:begin
for i:=1 to 255 do klucz[i]:=Random(255)+1;
for i:=1 to 255 do
begin
per[i]:=bufzapis[permut[i]];
perk[i]:=S(per[i],klucz[i]);
end;
end;
2:begin
for i:=1 to 255 do
begin
per[i]:=bufzapis[permut[i]];
perk[i]:=S(per[i],klucz[i]);
end;
for i:=1 to 255 do klucz[i]:=perk[i];
end;
end;
BlockWrite(krypto,perk,SizeOf(perk));
Form1.Gauge1.Progress:=FilePos(wiad);
{------------------------------------------------------------}
CloseFile(wiad);
CloseFile(krypto);
end;
end;
Form1.Otwrz1.Enabled:=true;
Form1.Button4.Enabled:=True;
end;
end.
{--------------------------------------------------------------------}
AssignFile(dane,ExtractFileDir(Application.ExeName)+'\mno.dat');
FileMode := 0;
Reset(dane);
SetLength(dane1,256);
for i:=0 to 255 do
begin
SetLength(dane1[i],256);
for j:=0 to 255 do
begin
BlockRead(dane,pom1,1);
dane1[i,j]:=pom1;
end;
end;
CloseFile(dane);
{-------------------------------------------------------------------}
if odp=true then
begin
Form1.Button1.Enabled:=False;
Form1.Button2.Enabled:=False;
Form1.Button4.Enabled:=False;
Form1.Button5.Enabled:=False;
Form1.Otwrz1.Enabled:=False;
Form1.Szyfruj1.Enabled:=False;
Form1.Edit1.Enabled:=False;
Form1.Edit2.Enabled:=False;
Form1.MaskEdit1.Enabled:=False;
Form1.MaskEdit2.Enabled:=False;
n:=255;
r:=130;
k:=125;
err:=65;
AssignFile(wiad,Form1.Edit1.Text);
Reset(wiad);
rozmiar:=FileSize(wiad);
Form1.Gauge1.MaxValue:=rozmiar;
koniec:=(rozmiar div k)*k;
AssignFile(krypto,Form1.Edit2.Text);
ReWrite(krypto);
RSgen(r);
{------------------------------------------------------------}
BlockWrite(krypto,rozmiar,SizeOf(rozmiar));
index:=Form1.RadioGroup1.ItemIndex;
BlockWrite(krypto,index,SizeOf(index));
RandSeed:=ziarno;
while (FilePos(wiad)<koniec) do
BlockRead(wiad,bufor,k);
j:=1;
For i:=n-1 downto r do
begin
v[i]:=bufor[j];
inc(j);
end;
Encode(n,r);
for i:=1 to 255 do bufzapis[i]:=v[n-i];
{----------------------------------------------------------------}
case Form1.RadioGroup1.ItemIndex of
0:begin
for i:=1 to 255 do
begin
per[i]:=bufzapis[permut[i]];
perk[i]:=S(per[i],klucz[i]);
end;
end;
1:begin
for i:=1 to 255 do klucz[i]:=Random(255)+1;
for i:=1 to 255 do
begin
per[i]:=bufzapis[permut[i]];
perk[i]:=S(per[i],klucz[i]);
end;
end;
2:begin
for i:=1 to 255 do
begin
per[i]:=bufzapis[permut[i]];
perk[i]:=S(per[i],klucz[i]);
end;
for i:=1 to 255 do klucz[i]:=perk[i];
end;
end;
BlockWrite(krypto,perk,SizeOf(perk));
Form1.Gauge1.Progress:=FilePos(wiad);
end;
{--------------------------------------------------------------------}
if rozmiar>125 then
begin
for i:=1 to 255 do bufor[i]:=255;
BlockRead(wiad,bufor,(rozmiar-koniec));
j:=1;
for i:=n-1 downto 1 do
begin
v[i]:=bufor[j];
inc(j);
end;
Encode(n,r);
for i:=1 to 255 do bufzapis[i]:=v[n-i];
case Form1.RadioGroup1.ItemIndex of
0:begin
for i:=1 to 255 do
begin
per[i]:=bufzapis[permut[i]];
perk[i]:=S(per[i],klucz[i]);
end;
end;
1:begin
for i:=1 to 255 do klucz[i]:=Random(255)+1;
for i:=1 to 255 do
begin
per[i]:=bufzapis[permut[i]];
perk[i]:=S(per[i],klucz[i]);
end;
end;
2:begin
for i:=1 to 255 do
begin
per[i]:=bufzapis[permut[i]];
perk[i]:=S(per[i],klucz[i]);
end;
for i:=1 to 255 do klucz[i]:=perk[i];
end;
end;
BlockWrite(krypto,perk,SizeOf(perk));
Form1.Gauge1.Progress:=FilePos(wiad);
{------------------------------------------------------------}
CloseFile(wiad);
CloseFile(krypto);
end;
end;
Form1.Otwrz1.Enabled:=true;
Form1.Button4.Enabled:=True;
end;
end.
begin
BlockRead(wiad,bufor,k);
j:=1;
For i:=n-1 downto r do
begin
v[i]:=bufor[j];
inc(j);
end;
Encode(n,r);
for i:=1 to 255 do bufzapis[i]:=v[n-i];
{----------------------------------------------------------------}
case Form1.RadioGroup1.ItemIndex of
0:begin
for i:=1 to 255 do
begin
per[i]:=bufzapis[permut[i]];
perk[i]:=S(per[i],klucz[i]);
end;
end;
1:begin
for i:=1 to 255 do klucz[i]:=Random(255)+1;
for i:=1 to 255 do
begin
per[i]:=bufzapis[permut[i]];
perk[i]:=S(per[i],klucz[i]);
end;
end;
2:begin
for i:=1 to 255 do
begin
per[i]:=bufzapis[permut[i]];
perk[i]:=S(per[i],klucz[i]);
end;
for i:=1 to 255 do klucz[i]:=perk[i];
end;
end;
BlockWrite(krypto,perk,SizeOf(perk));
Form1.Gauge1.Progress:=FilePos(wiad);
end;
{--------------------------------------------------------------------}
if rozmiar>125 then
begin
for i:=1 to 255 do bufor[i]:=255;
BlockRead(wiad,bufor,(rozmiar-koniec));
j:=1;
for i:=n-1 downto 1 do
v[i]:=bufor[j];
inc(j);
end;
Encode(n,r);
for i:=1 to 255 do bufzapis[i]:=v[n-i];
case Form1.RadioGroup1.ItemIndex of
0:begin
for i:=1 to 255 do
begin
per[i]:=bufzapis[permut[i]];
perk[i]:=S(per[i],klucz[i]);
end;
end;
1:begin
for i:=1 to 255 do klucz[i]:=Random(255)+1;
for i:=1 to 255 do
begin
per[i]:=bufzapis[permut[i]];
perk[i]:=S(per[i],klucz[i]);
end;
end;
2:begin
for i:=1 to 255 do
begin
per[i]:=bufzapis[permut[i]];
perk[i]:=S(per[i],klucz[i]);
end;
for i:=1 to 255 do klucz[i]:=perk[i];
end;
end;
BlockWrite(krypto,perk,SizeOf(perk));
Form1.Gauge1.Progress:=FilePos(wiad);
{------------------------------------------------------------}
CloseFile(wiad);
CloseFile(krypto);
end;
end;
Form1.Otwrz1.Enabled:=true;
Form1.Button4.Enabled:=True;
end;
end.
begin
v[i]:=bufor[j];
inc(j);
end;
Encode(n,r);
for i:=1 to 255 do bufzapis[i]:=v[n-i];
case Form1.RadioGroup1.ItemIndex of
0:begin
for i:=1 to 255 do
begin
per[i]:=bufzapis[permut[i]];
perk[i]:=S(per[i],klucz[i]);
end;
end;
1:begin
for i:=1 to 255 do klucz[i]:=Random(255)+1;
for i:=1 to 255 do
begin
per[i]:=bufzapis[permut[i]];
perk[i]:=S(per[i],klucz[i]);
end;
end;
2:begin
for i:=1 to 255 do
begin
per[i]:=bufzapis[permut[i]];
perk[i]:=S(per[i],klucz[i]);
end;
for i:=1 to 255 do klucz[i]:=perk[i];
end;
end;
BlockWrite(krypto,perk,SizeOf(perk));
Form1.Gauge1.Progress:=FilePos(wiad);
{------------------------------------------------------------}
CloseFile(wiad);
CloseFile(krypto);
end;
end;
Form1.Otwrz1.Enabled:=true;
Form1.Button4.Enabled:=True;
end;
end.
{Metoda konstrukcji nadmiarowego symetrycznego szyfru blokowego korygującego manipulacje na kryptogramach. }