Sunteți pe pagina 1din 62

Anexa (listarea programului)

114

Anexa
(listarea programului)
Programul este realizat n mediul de programare Delphi 4.0 i este structurat pe
dou mari uniti (unit-uri): unitatea Unit_Sistem, care este principala unitate i unde
se realizeaz ncrcarea imaginilor, salvarea acestora, prelucrarea, criptarea, decriptarea,
alegerea algoritmilor de criptare. Tot aici sunt realizate meniurile i butoanele rapide ct
i aciunile realizate de acestea. Cealalt unitate, Unit_alg_DES, conin procedurile
efective de criptare/decriptare pentru metodele de secretizare prezentate n lucrare
(Capitolul 6, Secretizarea Imaginilor Statice), procedurile de generare a subcheilor,
procedurile de transformare din zecimal n binar i invers, proceduri de deplasare spre
stnga i spre dreapta a numerelor binare. Toate aceste funcii ale unitii Unit_alg_DES
sunt apelate n procedurile pentru secretizare ale unitii principale Unit_Sistem.

unit Unit_Sistem;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ComCtrls, Menus, ExtCtrls, StdCtrls, ExtDlgs, Unit_alg_DES, ToolWin,
ImgList, Printers, GIFImage, MPlayer;
type
TForm_Sistem = class(TForm)
MainMenu: TMainMenu;
FileMenu: TMenuItem;
FileMenu_Load: TMenuItem;
FileMenu_Load_ImagNecriptata: TMenuItem;
FileMenu_Load_ImagCriptata: TMenuItem;
FileMenu_Save: TMenuItem;
FileMenu_Save_ImagCriptata: TMenuItem;
FileMenu_Save_ImagDecriptata: TMenuItem;
N1: TMenuItem;
FileMenu_Exit: TMenuItem;
StatusBar: TStatusBar;
FileMenu_Print: TMenuItem;
N2: TMenuItem;
MenuPagina: TMenuItem;
MenuPagina_SimulareSistem: TMenuItem;
MenuPagina_ModulEmisie: TMenuItem;
MenuPagina_ModulReceptie: TMenuItem;
MenuPrelucrare: TMenuItem;
MenuHelp: TMenuItem;
About1: TMenuItem;
Contents1: TMenuItem;
ImagineBackground: TImage;
MenuAlgoritmi: TMenuItem;
MenuAlgoritmi_DES: TMenuItem;
MenuAlgoritmi_RAND: TMenuItem;
MenuAlgoritmi_RandDes: TMenuItem;

Anexa (listarea programului)

MenuAlgoritmi_TripleDES: TMenuItem;
ComboBox_Algoritm: TComboBox;
ScrollBox1: TScrollBox;
Image1: TImage;
ScrollBox2: TScrollBox;
Image2: TImage;
ScrollBox3: TScrollBox;
Image3: TImage;
CheckBox: TCheckBox;
OpenPictureDialog_Necriptata: TOpenPictureDialog;
OpenPictureDialog_Criptata: TOpenPictureDialog;
Button_Criptare: TButton;
Panel_Criptare: TPanel;
ProgressBar_DES: TProgressBar;
Label_DES: TLabel;
GroupBox_CheiCriptare: TGroupBox;
Panel_Cheie_RAND: TPanel;
Label_Cheie_RAND: TLabel;
Edit_Cheie_RAND: TEdit;
Panel_Chei_DES: TPanel;
Label_Cheie_DES: TLabel;
Edit_Chei_DES2: TEdit;
Edit_Chei_DES3: TEdit;
Edit_Chei_DES4: TEdit;
SavePictureDialog_Criptata: TSavePictureDialog;
SavePictureDialog_Decriptata: TSavePictureDialog;
Panel_Decriptare: TPanel;
Label_Decriptare: TLabel;
ProgressBar_Decriptare: TProgressBar;
GroupBox_CheiDecriptare: TGroupBox;
Panel_Cheie_RAND_decr: TPanel;
Label_Cheie_RAND_decr: TLabel;
Edit_Cheie_RAND_decr: TEdit;
Panel_Cheie_DES_decr: TPanel;
Label_Cheie_DES_decr: TLabel;
Edit_Chei_DES2_decr: TEdit;
Edit_Chei_DES3_decr: TEdit;
Edit_Chei_DES4_decr: TEdit;
Edit_Chei_DES1_decr: TEdit;
Button_Decriptare: TButton;
ToolBar: TToolBar;
ToolButton1: TToolButton;
ToolButton_LoadOriginal: TToolButton;
ToolButton_Criptare: TToolButton;
ToolButton2: TToolButton;
ToolButton_LoadCriptata: TToolButton;
ToolButton_Decriptare: TToolButton;
ToolButton_SaveCriptata: TToolButton;
ToolButton_ZoomOriginal: TToolButton;
ToolButton_ZoomCriptata: TToolButton;
ToolButton3: TToolButton;
ToolButton_SaveDecriptata: TToolButton;
Panel_ImagReala: TPanel;
ScrollBox_ImagReala: TScrollBox;
Image_Reala: TImage;
ToolButton_ZoomDecriptata: TToolButton;
Image_Fundal1: TImage;
Image_Fundal2: TImage;
Image_Fundal3: TImage;
PrinterSetupDialog: TPrinterSetupDialog;
PrintDialog: TPrintDialog;
FileMenu_PrintSursa: TMenuItem;

115

Anexa (listarea programului)

FileMenu_PrintCriptata: TMenuItem;
FileMenu_PrintDecriptata: TMenuItem;
FileMenu_PrintSetup: TMenuItem;
MenuPrelucrareCriptare: TMenuItem;
MenuPrelucrareDecriptare: TMenuItem;
MenuPrelucrareVizualizare: TMenuItem;
MenuPrelucrareVizualizareStretch: TMenuItem;
MenuPrelucrareVizualizareReala: TMenuItem;
MenuChei: TMenuItem;
MenuCheiCriptare: TMenuItem;
MenuCheiDecriptare: TMenuItem;
N3: TMenuItem;
ToolButton4: TToolButton;
ToolButton_CheieCriptare: TToolButton;
ToolButton_CheieDecriptare: TToolButton;
ToolButton5: TToolButton;
ToolButton_Stretch: TToolButton;
ToolButton_PrintCriptata: TToolButton;
ToolButton6: TToolButton;
ToolButton_CloseZoom: TToolButton;
FileMenu_Sterge: TMenuItem;
ToolButton_Stergere: TToolButton;
ImageList: TImageList;
ImageList_disabled: TImageList;
MenuPrelucrareVizualizareRealaSursa: TMenuItem;
MenuPrelucrareVizualizareRealaCriptata: TMenuItem;
MenuPrelucrareVizualizareRealaDecriptata: TMenuItem;
Panel1: TPanel;
Label3: TLabel;
Button_CancelCriptare: TButton;
Panel2: TPanel;
Label4: TLabel;
Button_CancelDecriptare: TButton;
Edit_Chei_DES1: TEdit;
Panel_DateImg: TPanel;
Label5: TLabel;
Panel_DateCriptare: TPanel;
Label6: TLabel;
Label7: TLabel;
Label_cale: TLabel;
Label8: TLabel;
Label_dim: TLabel;
Label9: TLabel;
Label_format1: TLabel;
Label_1: TLabel;
Label10: TLabel;
Label_estimat: TLabel;
Label_alg: TLabel;
Label_2: TLabel;
Label_3: TLabel;
Label_exec: TLabel;
Label_vit: TLabel;
Label_format2: TLabel;
MenuPrelucrareAnim: TMenuItem;
Label1: TLabel;
Label_anim: TLabel;
GIFImage_comp11: TGIFImage;
GIFImage_comp12: TGIFImage;
GIFImage_Sistem: TGIFImage;
GIFImage_comp21: TGIFImage;
GIFImage_comp22: TGIFImage;
Image_Anim_sursa: TImage;

116

Anexa (listarea programului)

Timer1: TTimer;
Image_Anim_Criptata: TImage;
Timer2: TTimer;
GIFImage_pelinie1: TGIFImage;
Timer3: TTimer;
GIFImage_unde: TGIFImage;
GIFImage_pelinie2: TGIFImage;
Timer4: TTimer;
Timer5: TTimer;
Timer6: TTimer;
Timer7: TTimer;
Image_Anim_Decriptata: TImage;
GIFImage_scris_sursa: TGIFImage;
GIFImage_scris_criptata: TGIFImage;
GIFImage_scris_decriptata: TGIFImage;
MediaPlayer: TMediaPlayer;
ToolButton_Send: TToolButton;
ToolButton_Receive: TToolButton;
FileMenu_Send: TMenuItem;
FileMenu_Receive: TMenuItem;
N4: TMenuItem;
Image_Reala_Fundal: TImage;
GroupBox_SendReceive: TGroupBox;
Panel_SenReceive_Rand: TPanel;
Label2: TLabel;
Edit_Rand: TEdit;
Panel_SendReceive_Des: TPanel;
Label11: TLabel;
Edit_Des02: TEdit;
Edit_Des03: TEdit;
Edit_Des04: TEdit;
Edit_Des01: TEdit;
Panel_SendReceive_Des1: TPanel;
Label12: TLabel;
Edit_Des12: TEdit;
Edit_Des13: TEdit;
Edit_Des14: TEdit;
Edit_Des11: TEdit;
Panel_SendReceive_Des2: TPanel;
Label13: TLabel;
Edit_Des22: TEdit;
Edit_Des23: TEdit;
Edit_Des24: TEdit;
Edit_Des21: TEdit;
SaveDialog_Send: TSaveDialog;
Image4: TImage;
GIFImage_criptare: TGIFImage;
GIFImage_decriptare: TGIFImage;
GIFImage_scris_fundal: TGIFImage;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure FormPaint(Sender: TObject);
procedure FileMenu_Load_ImagNecriptataClick(Sender: TObject);
procedure FileMenu_Load_ImagCriptataClick(Sender: TObject);
procedure CheckBoxClick(Sender: TObject);
procedure ComboBox_AlgoritmChange(Sender: TObject);
procedure MenuAlgoritmi_DESClick(Sender: TObject);
procedure MenuAlgoritmi_RANDClick(Sender: TObject);
procedure MenuAlgoritmi_RandDesClick(Sender: TObject);
procedure MenuAlgoritmi_TripleDESClick(Sender: TObject);
procedure Button_CriptareClick(Sender: TObject);
procedure FileMenu_Save_ImagCriptataClick(Sender: TObject);

117

Anexa (listarea programului)

procedure FileMenu_Save_ImagDecriptataClick(Sender: TObject);


// procedure Button_DecriptareClick(Sender: TObject);
procedure ToolButton_ZoomOriginalClick(Sender: TObject);
procedure Button_ImagRealaClick(Sender: TObject);
procedure FileMenu_ExitClick(Sender: TObject);
procedure FileMenu_StergeClick(Sender: TObject);
procedure Button_CancelCriptareClick(Sender: TObject);
procedure ToolButton_CheieCriptareClick(Sender: TObject);
procedure MenuCheiCriptareClick(Sender: TObject);
procedure ToolButton_CheieDecriptareClick(Sender: TObject);
procedure MenuCheiDecriptareClick(Sender: TObject);
procedure Edit_Cheie_RANDKeyPress(Sender: TObject; var Key: Char);
procedure Edit_Chei_DES1KeyPress(Sender: TObject; var Key: Char);
procedure FileMenu_PrintSetupClick(Sender: TObject);
procedure FileMenu_PrintSursaClick(Sender: TObject);
procedure MenuPrelucrareAnimClick(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
procedure Timer2Timer(Sender: TObject);
procedure Timer3Timer(Sender: TObject);
procedure Timer4Timer(Sender: TObject);
procedure Timer5Timer(Sender: TObject);
procedure Timer6Timer(Sender: TObject);
procedure Timer7Timer(Sender: TObject);
procedure MenuPagina_SimulareSistemClick(Sender: TObject);
procedure MenuPagina_ModulEmisieClick(Sender: TObject);
procedure MenuPagina_ModulReceptieClick(Sender: TObject);
procedure ToolButton_SendClick(Sender: TObject);
private
{ Private declarations }
flag_cancel, steag_iesire_anim:boolean;
public
{ Public declarations }
end;
type buffer_zec = array[0..5000000] of byte;
buffer_bin = array[0..50000000] of byte;
FUNCTION GetPixelFormatString(CONST PixelFormat: TPixelFormat): STRING;
FUNCTION GetBitmapDimensionsString(CONST Bitmap: TBitmap): STRING;
var
Form_Sistem: TForm_Sistem;
BackgroundBitmap, BackgroundBitmap1 : TBitmap;
BitmapOriginal, BitmapCriptat, BitmapDecriptat: TBitmap;
BitmapCriptat1, BitmapDecriptat1 :TBitmap;
flag : boolean;
flag_algoritm:integer;
DirectoryName, FileName:string;
Delta, Delta_linii:integer;
Start:dword;
buff_org, buff_cript, buff_decript:buffer_bin;
Timp64bit:integer;
f:file of byte;
size_fisier:integer;
vect_stare:array[1..16] of byte;

118

Anexa (listarea programului)

implementation
USES
ShellAPI; // ShellExecute
{$R *.DFM}
{$R resurse.RES}
FUNCTION GetPixelFormatString(CONST PixelFormat: TPixelFormat): STRING;
VAR
Format: STRING;
BEGIN
CASE PixelFormat OF
pfDevice: Format := 'Device;';
pf1bit: Format := '1 bit/pixel;';
pf4bit: Format := '4 biti/pixel;';
pf8bit: Format := '8 biti/pixel;';
pf15bit: Format := '15 biti/pixel;';
pf16bit: Format := '16 biti/pixel;';
pf24bit: Format := '24 biti/pixel;';
pf32bit: Format := '32 biti/pixel;'
ELSE
Format := 'Necunoscut,';
END;
RESULT := Format;
END {GetPixelFormatString};
FUNCTION GetBitmapDimensionsString(CONST Bitmap: TBitmap): STRING;
BEGIN
RESULT :='Latimea: '+ IntToStr(Bitmap.Width) + ' ; Inaltimea: ' +
IntToStr(Bitmap.Height);
//GetPixelFormatString(Bitmap.PixelFormat) + ' color';
END {GetBitmapDimensionsString};

procedure TForm_Sistem.FormCreate(Sender: TObject);


begin
BackgroundBitmap := TBitmap.Create;
BackgroundBitmap.LoadFromResourceName(hInstance,'fundal');
BackgroundBitmap1 := TBitmap.Create;
BackgroundBitmap1.LoadFromResourceName(hInstance,'fundalm');
flag_algoritm:=0;//adica nu am ales nici un algoritm
//ce meniuri sunt nu active
FileMenu_Sterge.Enabled:=False;
FileMenu_Save.Enabled:=False;
FileMenu_Save_ImagCriptata.Enabled:=false;
FileMenu_Save_ImagDecriptata.Enabled:=false;
FileMenu_Send.Enabled:=false;
FileMenu_Receive.Enabled:=false;
FileMenu_Print.Enabled:=False;
FileMenu_PrintSursa.Enabled:=False;
FileMenu_PrintCriptata.Enabled:=False;

119

Anexa (listarea programului)

FileMenu_PrintDecriptata.Enabled:=False;
MenuPrelucrare.Enabled:=False;
MenuPrelucrareCriptare.Enabled:=False;
MenuPrelucrareDecriptare.Enabled:=False;
MenuPrelucrareVizualizare.Enabled:=False;
MenuPrelucrareVizualizareReala.Enabled:=False;
MenuPrelucrareVizualizareRealaSursa.Enabled:=False;
MenuPrelucrareVizualizareRealaCriptata.Enabled:=False;
MenuPrelucrareVizualizareRealaDecriptata.Enabled:=False;
//ce toolbutton sunt nu active
ToolButton_Criptare.Enabled:=false;
ToolButton_ZoomOriginal.Enabled:=false;
ToolButton_Decriptare.Enabled:=false;
ToolButton_SaveCriptata.Enabled:=false;
ToolButton_ZoomCriptata.Enabled:=false;
ToolButton_PrintCriptata.Enabled:=false;
ToolButton_Send.Enabled:=false;
ToolButton_SaveDecriptata.Enabled:=false;
ToolButton_ZoomDecriptata.Enabled:=false;
ToolButton_Receive.Enabled:=false;
ToolButton_Stergere.Enabled:=false;
Label_anim.Caption:='Neselectata...';
//gifuri
GIFImage_comp11.LoadFromResourceName(hInstance,'comp');
GIFImage_pelinie1.LoadFromResourceName(hInstance,'pe_linie');
GIFImage_unde.LoadFromResourceName(hInstance,'unde');
GIFImage_criptare.LoadFromResourceName(hInstance,'key_je');
GIFImage_decriptare.LoadFromResourceName(hInstance,'key_je');
GIFImage_scris_sursa.LoadFromResourceName(hInstance,'scriss');
GIFImage_scris_criptata.LoadFromResourceName(hInstance,'scrisc');
GIFImage_scris_decriptata.LoadFromResourceName(hInstance,'scrisd');
GIFImage_scris_fundal.LoadFromFile('C:\Prog_Delfi\DES\PROGRAMUL\scrisf.gif');
end; // terminat OnFormCreate
procedure TForm_Sistem.FormDestroy(Sender: TObject);
begin
BackgroundBitmap.Free;
BackgroundBitmap1.Free;
end; // terminat OnFormDestroy

procedure TForm_Sistem.FormPaint(Sender: TObject);


begin
ImagineBackground.Picture.Graphic := BackgroundBitmap;
Image_Reala_Fundal.Picture.Graphic:= BackgroundBitmap;
Image_Fundal1.Picture.Graphic := BackgroundBitmap1;
Image_Fundal2.Picture.Graphic := BackgroundBitmap1;
Image_Fundal3.Picture.Graphic := BackgroundBitmap1;
//cu gifurile
GIFImage_comp12.LoadFromResourceName(hInstance,'comp_trs');
GIFImage_sistem.LoadFromResourceName(hInstance,'sistem');
GIFImage_comp22.LoadFromResourceName(hInstance,'comp_rec');

120

Anexa (listarea programului)

end; // terminat OnFormPaint


procedure TForm_Sistem.FileMenu_ExitClick(Sender: TObject);
var Raspuns:word;
begin
Raspuns:= MessageDlg('Se doreste parasirea aplicatiei ?',
mtConfirmation, [mbYes, mbNo], 0);
if Raspuns=mrYes then begin
Beep;
Application.Terminate;
end;
end; // terminat Procedura FileMenu_ExitClick
procedure TForm_Sistem.FileMenu_Load_ImagNecriptataClick(Sender: TObject);
begin
if openpicturedialog_Necriptata.Execute then begin
IF Assigned(BitmapOriginal)
THEN BitmapOriginal.Free;
///////
Image1.Autosize:=false;
Image1.Align:=alClient;
Image2.Autosize:=false;
Image2.Align:=alClient;
Image3.Autosize:=false;
Image3.Align:=alClient;
flag:=true;
//adica dimensiunile imaginii sunt mai mici decat dim. ScrollBox-ului
BitmapOriginal := TBitmap.Create;
BitmapOriginal.LoadFromFile(OpenPictureDialog_Necriptata.Filename);
//aflu marimea fisierului imagine:
AssignFile(f, OpenPictureDialog_Necriptata.FileName);
Reset(f);
size_fisier := FileSize(f);
CloseFile(f);
//Label2.Caption:=IntToStr(size_fisier);
DirectoryName := ExtractFilePath(OpenPictureDialog_Necriptata.Filename);
FileName:= ExtractFileName(OpenPictureDialog_Necriptata.Filename);
Label_cale.Caption:= DirectoryName + FileName;
Label_dim.Caption:= GetBitmapDimensionsString(BitmapOriginal);
Label_format1.Caption:= GetPixelFormatString(BitmapOriginal.PixelFormat);
Label_estimat.Caption:='';
Label_exec.Caption:='';
Label_vit.Caption:='';
CASE BitmapOriginal.PixelFormat OF
pfDevice: Label_format2.Caption := 'Imaginea este de tip "Device".';
pf1bit: Label_format2.Caption := 'Imaginea este de tip "alb/negru".';
pf4bit: Label_format2.Caption := 'Imaginea este de tip "16 culori".';
pf8bit: Label_format2.Caption := 'Imaginea este de tip "256 culori".';
pf15bit: Label_format2.Caption := 'Imaginea este de tip "High color".';

121

Anexa (listarea programului)

122

pf16bit: Label_format2.Caption := 'Imaginea este de tip "High color".';


pf24bit: Label_format2.Caption := 'Imaginea este de tip "True color".';
pf32bit: Label_format2.Caption := 'Imaginea este de tip "True color".'
ELSE
Label_format2.Caption := 'Imaginea este de tip "Necunoscut".';
END;
//caz: imagine mare
if (ScrollBox1.Height<BitmapOriginal.Height) or
(ScrollBox1.Width<BitmapOriginal.Width) then begin
Image1.Autosize:=true;
Image1.Align:=alNone;
Image2.Autosize:=true;
Image2.Align:=alNone;
Image3.Autosize:=true;
Image3.Align:=alNone;
flag:=false;
end;
if (ToolButton_Stretch.Down=true) or (MenuPrelucrareVizualizareStretch.Checked = True) then
begin
Image1.Stretch := true;
Image1.Align:=alClient;
Image2.Stretch := true;
Image2.Align:=alClient;
Image3.Stretch := true;
Image3.Align:=alClient;
end;
///
Image1.Picture.Graphic := BitmapOriginal;
// meniurile care devin active
FileMenu_Sterge.Enabled:=True;
FileMenu_Print.Enabled:=True;
FileMenu_PrintSursa.Enabled:=True;
MenuPrelucrare.Enabled:=True;
MenuPrelucrareCriptare.Enabled:=True;
MenuPrelucrareVizualizare.Enabled:=True;
MenuPrelucrareVizualizareReala.Enabled:=True;
MenuPrelucrareVizualizareRealaSursa.Enabled:=True;
//ce toolbutton devin active
ToolButton_Criptare.Enabled:=True;
ToolButton_ZoomOriginal.Enabled:=True;
ToolButton_Stergere.Enabled:=True;
end;
end; // terminat procedura FileMenu_Load_ImagNecriptataClick

procedure TForm_Sistem.FileMenu_Load_ImagCriptataClick(Sender: TObject);


begin
if openpicturedialog_Criptata.Execute then begin
IF Assigned(BitmapCriptat)
THEN BitmapCriptat.Free;
Image1.Autosize:=false;
Image1.Align:=alClient;

Anexa (listarea programului)

123

Image2.Autosize:=false;
Image2.Align:=alClient;
Image3.Autosize:=false;
Image3.Align:=alClient;
flag:=true;
//adica dimensiunile imaginii sunt mai mici decat dim. ScrollBox-ului
BitmapCriptat := TBitmap.Create;
BitmapCriptat.LoadFromFile(OpenPictureDialog_Criptata.Filename);
//aflu marimea fisierului imagine:
AssignFile(f, OpenPictureDialog_Criptata.FileName);
Reset(f);
size_fisier := FileSize(f);
CloseFile(f);
//Label2.Caption:=IntToStr(size_fisier);
DirectoryName := ExtractFilePath(OpenPictureDialog_Criptata.Filename);
FileName:= ExtractFileName(OpenPictureDialog_Criptata.Filename);
Label_cale.Caption:= DirectoryName + FileName;
Label_dim.Caption:= GetBitmapDimensionsString(BitmapCriptat);
Label_format1.Caption:= GetPixelFormatString(BitmapCriptat.PixelFormat);
Label_estimat.Caption:='';
Label_exec.Caption:='';
Label_vit.Caption:='';
CASE BitmapCriptat.PixelFormat OF
pfDevice: Label_format2.Caption := 'Imaginea este de tip "Device".';
pf1bit: Label_format2.Caption := 'Imaginea este de tip "alb/negru".';
pf4bit: Label_format2.Caption := 'Imaginea este de tip "16 culori".';
pf8bit: Label_format2.Caption := 'Imaginea este de tip "256 culori".';
pf15bit: Label_format2.Caption := 'Imaginea este de tip "High color".';
pf16bit: Label_format2.Caption := 'Imaginea este de tip "High color".';
pf24bit: Label_format2.Caption := 'Imaginea este de tip "True color".';
pf32bit: Label_format2.Caption := 'Imaginea este de tip "True color".'
ELSE
Label_format2.Caption := 'Imaginea este de tip "Necunoscut".';
END;
//caz: imagine mare
if (ScrollBox2.Height<BitmapCriptat.Height) or
(ScrollBox2.Width<BitmapCriptat.Width) then begin
Image1.Autosize:=true;
Image1.Align:=alNone;
Image2.Autosize:=true;
Image2.Align:=alNone;
Image3.Autosize:=true;
Image3.Align:=alNone;
flag:=false;
end;
if (ToolButton_Stretch.Down=true) or (MenuPrelucrareVizualizareStretch.Checked = True) then
begin
Image1.Stretch := true;
Image1.Align:=alClient;
Image2.Stretch := true;
Image2.Align:=alClient;
Image3.Stretch := true;
Image3.Align:=alClient;
end;
///

Anexa (listarea programului)

Image2.Picture.Graphic := BitmapCriptat;
// meniurile care devin active
FileMenu_Sterge.Enabled:=True;
FileMenu_Print.Enabled:=True;
FileMenu_PrintCriptata.Enabled:=True;
MenuPrelucrare.Enabled:=True;
MenuPrelucrareDecriptare.Enabled:=True;
MenuPrelucrareVizualizare.Enabled:=True;
MenuPrelucrareVizualizareReala.Enabled:=True;
MenuPrelucrareVizualizareRealaCriptata.Enabled:=True;
//ce toolbutton devin active
ToolButton_Decriptare.Enabled:=True;
ToolButton_ZoomCriptata.Enabled:=True;
ToolButton_PrintCriptata.Enabled:=True;
ToolButton_Stergere.Enabled:=True;
if MenuPagina_ModulEmisie.Checked=True then begin
FileMenu_PrintSursa.Enabled:=True;
FileMenu_Save_ImagCriptata.Enabled:=False;
FileMenu_Send.Enabled:=True;
MenuPrelucrareDecriptare.Enabled:=False;
MenuPrelucrareVizualizareRealaSursa.Enabled:=False;
ToolButton_Criptare.Enabled:=False;
ToolButton_ZoomOriginal.Enabled:=False;
ToolButton_Send.Enabled:=True;
ToolButton_Decriptare.Enabled:=False;
ToolButton_SaveCriptata.Enabled:=False;
Image1.Picture.Graphic := nil;
end;
if MenuPagina_ModulReceptie.Checked=True then begin
FileMenu_Load_ImagNecriptata.Enabled:=False;
FileMenu_Save_ImagCriptata.Enabled:=False;
FileMenu_Send.Enabled:=false;
MenuPrelucrareDecriptare.Enabled:=true;
MenuPrelucrareVizualizareRealaSursa.Enabled:=False;
MenuPrelucrareVizualizareRealaCriptata.Enabled:=True;
ToolButton_Send.Enabled:=false;
ToolButton_Decriptare.Enabled:=true;
ToolButton_SaveCriptata.Enabled:=False;
Image3.Picture.Graphic := nil;
end;
end;
end; // terminat procedura FileMenu_Load_ImagCriptataClick
procedure TForm_Sistem.FileMenu_Save_ImagCriptataClick(Sender: TObject);
begin
IF SavePictureDialog_Criptata.Execute
THEN BitmapCriptat.SaveToFile(SavePictureDialog_Criptata.Filename)
end; // terminat Procedura FileMenu_Save_ImagCriptataClick

procedure TForm_Sistem.FileMenu_Save_ImagDecriptataClick(Sender: TObject);

124

Anexa (listarea programului)

begin
IF SavePictureDialog_Decriptata.Execute
THEN BitmapDecriptat.SaveToFile(SavePictureDialog_Decriptata.Filename)
end; // terminat Procedura FileMenu_Save_ImagDecriptataClick

procedure TForm_Sistem.CheckBoxClick(Sender: TObject);


var steag:boolean;
begin
if (sender=ToolButton_Stretch) OR (sender=MenuPrelucrareVizualizareStretch) then
BEGIN
if sender=MenuPrelucrareVizualizareStretch then begin
if MenuPrelucrareVizualizareStretch.Checked = False then begin
MenuPrelucrareVizualizareStretch.Checked := True;
ToolButton_Stretch.Down:=True;
steag:=true;
end
else begin
steag:=False;
MenuPrelucrareVizualizareStretch.Checked := False;
ToolButton_Stretch.Down:= False;
end;
end;
if sender=ToolButton_Stretch then begin
if ToolButton_Stretch.Down = False then begin //adica butonul e sus
//ToolButton_Stretch.Down := True;
MenuPrelucrareVizualizareStretch.Checked := False;
steag:=false;
end
else begin // adica butonul e jos
steag:=True;
MenuPrelucrareVizualizareStretch.Checked := True;
// ToolButton_Stretch.Down:= False;
end;
end;
if steag=true then begin
Image1.Stretch := true;
Image1.Align:=alClient;
Image2.Stretch := true;
Image2.Align:=alClient;
Image3.Stretch := true;
Image3.Align:=alClient;
end
else begin
Image1.Stretch := false;
Image1.Align:=alNone;
Image2.Stretch := false;
Image2.Align:=alNone;
Image3.Stretch := false;
Image3.Align:=alNone;
if flag=true then begin
Image1.Autosize:=false;
Image2.Autosize:=false;
Image2.Autosize:=false;
end
else begin
Image1.Autosize:=true;
Image2.Autosize:=true;
Image3.Autosize:=true;
end;
end;

125

Anexa (listarea programului)

END;
end; //terminat procedura CheckBoxClick
procedure TForm_Sistem.ComboBox_AlgoritmChange(Sender: TObject);
begin
case ComboBox_Algoritm.ItemIndex of
0: begin
flag_algoritm:=1;
MenuAlgoritmi_DES.Checked:=True;
MenuAlgoritmi_RAND.Checked:=False;
MenuAlgoritmi_RandDes.Checked:=False;
MenuAlgoritmi_TripleDES.Checked:=False;
//Label_Algoritm.Caption:='Algoritmul de criptare: DES';
end;
1: begin
flag_algoritm:=2;
MenuAlgoritmi_DES.Checked:=False;
MenuAlgoritmi_RAND.Checked:=True;
MenuAlgoritmi_RandDes.Checked:=False;
MenuAlgoritmi_TripleDES.Checked:=False;
//Label_Algoritm.Caption:='Algoritmul de criptare: RAND';
end;
2: begin
flag_algoritm:=3;
MenuAlgoritmi_DES.Checked:=False;
MenuAlgoritmi_RAND.Checked:=False;
MenuAlgoritmi_RandDes.Checked:=True;
MenuAlgoritmi_TripleDES.Checked:=False;
// Label_Algoritm.Caption:='Algoritmul de criptare: RandDes';
end;
3: begin
flag_algoritm:=4;
MenuAlgoritmi_DES.Checked:=False;
MenuAlgoritmi_RAND.Checked:=False;
MenuAlgoritmi_RandDes.Checked:=False;
MenuAlgoritmi_TripleDES.Checked:=True;
//Label_Algoritm.Caption:='Algoritmul de criptare: RandTripleDES';
end;
end;
end; //terminat procedura ComboBox_AlgoritmChange
procedure TForm_Sistem.MenuAlgoritmi_DESClick(Sender: TObject);
begin
flag_algoritm:=1;
MenuAlgoritmi_DES.Checked:=True;
MenuAlgoritmi_RAND.Checked:=False;
MenuAlgoritmi_RandDes.Checked:=False;
MenuAlgoritmi_TripleDES.Checked:=False;
Label_alg.Caption:='"DES"';
ComboBox_Algoritm.Text:='DES';
end; // terminat MenuAlgoritmi_DESClick
procedure TForm_Sistem.MenuAlgoritmi_RANDClick(Sender: TObject);
begin
flag_algoritm:=2;
MenuAlgoritmi_DES.Checked:=False;
MenuAlgoritmi_RAND.Checked:=True;
MenuAlgoritmi_RandDes.Checked:=False;
MenuAlgoritmi_TripleDES.Checked:=False;

126

Anexa (listarea programului)

127

Label_alg.Caption:='"RAND"';
ComboBox_Algoritm.Text:='RAND';
end; // terminat MenuAlgoritmi_RANDClick
procedure TForm_Sistem.MenuAlgoritmi_RandDesClick(Sender: TObject);
begin
flag_algoritm:=3;
MenuAlgoritmi_DES.Checked:=False;
MenuAlgoritmi_RAND.Checked:=False;
MenuAlgoritmi_RandDes.Checked:=True;
MenuAlgoritmi_TripleDES.Checked:=False;
Label_alg.Caption:='"RandDes"';
ComboBox_Algoritm.Text:='RandDes';
end;// terminat MenuAlgoritmi_RandDesClick
procedure TForm_Sistem.MenuAlgoritmi_TripleDESClick(Sender: TObject);
begin
flag_algoritm:=4;
MenuAlgoritmi_DES.Checked:=False;
MenuAlgoritmi_RAND.Checked:=False;
MenuAlgoritmi_RandDes.Checked:=False;
MenuAlgoritmi_TripleDES.Checked:=True;
Label_alg.Caption:='"RandTripleDES"';
ComboBox_Algoritm.Text:='RandTripleDES';
end; // terminat MenuAlgoritmi_TripleDESClick

procedure TForm_Sistem.Button_CriptareClick(Sender: TObject);


var
i, j, k, lungime_sir, pas, pas_ext, cat, rest, lungime_finala: integer;
lung_buff_org, lung_buff_cript: integer;
RowIn
: pByteArray;
RowOut
: pByteArray;
Nr_octeti_per_linie: INTEGER;
ScanlineByteCount: INTEGER;
sir_biti, sir, sir_de_biti:string;
RandomValue, round : BYTE;
multiplicator :integer;
timp_estimat, timp_min, timp_sec, timp_real, viteza, nr_kb:real;
steag_cheie:boolean;
label Animatie;
begin
if (Sender=ToolButton_Criptare) OR (Sender=MenuPrelucrareCriptare) then BEGIN
if (ComboBox_Algoritm.Text='DES') or (MenuAlgoritmi_DES.Checked=True) then
flag_algoritm:=1;
if (ComboBox_Algoritm.Text='RAND') or (MenuAlgoritmi_RAND.Checked=True) then
flag_algoritm:=2;
if (ComboBox_Algoritm.Text='RandDes') or (MenuAlgoritmi_RandDes.Checked=True) then
flag_algoritm:=3;
if (ComboBox_Algoritm.Text='RandTripleDES') or (MenuAlgoritmi_TripleDES.Checked=True) then
flag_algoritm:=4;
if flag_algoritm=0 then begin
beep;
ShowMessage('Mai intai alegeti un algoritm de criptare!!!');
end;
case BitmapOriginal.PixelFormat of
pf1bit: multiplicator:=1;

Anexa (listarea programului)

pf4bit: multiplicator:=4;
pf8bit: multiplicator:=8;
pf15bit: multiplicator:=15;
pf16bit: multiplicator:=16;
pf24bit: multiplicator:=24;
pf32bit: multiplicator:=32;
end;
// ANIMATIA de la calculator la criptor
if (MenuPrelucrareAnim.Checked=True) AND (flag_algoritm<>0) then begin
steag_iesire_anim:=false;
GIFImage_comp12.Visible:=false;
//GIFImage_comp11.LoadFromFile('C:\Prog_Delfi\DES\PROGRAMUL\computer.gif');
GIFImage_comp11.Left:=2;
GIFImage_comp11.Top:=72;
GIFImage_comp11.Visible:=true;
GIFImage_comp11.Animate:=true;
Image_Anim_Sursa.Picture.Graphic:=BitmapOriginal;
Image_Anim_Sursa.Visible:=true;
Image_Anim_Sursa.left:=90;
Image_Anim_Sursa.top:=80;
Timer1.Enabled:=true;
repeat
Application.ProcessMessages;
until steag_iesire_anim=true;
GIFImage_comp11.Animate:=false;
GIFImage_comp11.Visible:=false;
//GIFImage_comp11:= nil;
GIFImage_comp12.Visible:=true;
end;//de la animatie
//calcularea timpului estimat
if flag_algoritm<>0 then begin
steag_cheie:=true;
//Autotestarea calculatorului!!!!!
// verific cat ii ia calculatorului pt 64 de biti sa faca DES
sir:='1010110101' + '1010110101'+ '1010110101'+ '1010110101'+
'1010110101'+ '1010110101'+ '1010';
for i:=1 to 64 do cheia_criptare[i]:=StrToInt(sir[i]);
generarea_subcheilor_la_criptare(cheia_criptare);
sir:='1010110101' + '1010110101'+ '1010110101'+ '1010110101'+
'1010110101'+ '1010110101'+ '1010';
Start:=GetTickCount;
for j:=1 to 30 do begin
for i:=0 to 63 do
text_clar[i+1]:=StrToInt(sir[i+1]);//text_clar incepe de la 1..64
//fac criptarea blocului de 64 de biti
text_criptat:=criptare_des(text_clar);
end;
Timp64bit:= GetTickCount - Start;
//Label2.Caption := 'Timpul = ' +
// Format('%.3f', [(Timp64bit)/1000]) +
//
' secunde';
Label_estimat.Caption:='';
Label_exec.Caption:='';
Label_vit.Caption:='';
end; //Testare
//verificarea si completez cheile
{if flag_algoritm<>0 then begin

128

Anexa (listarea programului)

sir:=Edit_Chei_DES1.Text;
if length(sir)<16 then for i:=length(sir)+1 to 16 do sir[i]:='1';
Edit_Chei_DES1.Text:=sir;
sir:=Edit_Chei_DES2.Text;
if length(sir)<16 then for i:=length(sir)+1 to 16 do sir[i]:='1';
Edit_Chei_DES2.Text:=sir;
sir:=Edit_Chei_DES3.Text;
if length(sir)<16 then for i:=length(sir)+1 to 16 do sir[i]:='1';
Edit_Chei_DES3.Text:=sir;
sir:=Edit_Chei_DES4.Text;
if length(sir)<16 then for i:=length(sir)+1 to 16 do sir[i]:='1';
Edit_Chei_DES4.Text:=sir;
sir:=Edit_DES01.Text;
if length(sir)<16 then for i:=length(sir)+1 to 16 do sir[i]:='1';
Edit_DES01.Text:=sir;
sir:=Edit_DES02.Text;
if length(sir)<16 then for i:=length(sir)+1 to 16 do sir[i]:='1';
Edit_DES02.Text:=sir;
sir:=Edit_DES03.Text;
if length(sir)<16 then for i:=length(sir)+1 to 16 do sir[i]:='1';
Edit_DES03.Text:=sir;
sir:=Edit_DES04.Text;
if length(sir)<16 then for i:=length(sir)+1 to 16 do sir[i]:='1';
Edit_DES04.Text:=sir;
sir:=Edit_DES11.Text;
if length(sir)<16 then for i:=length(sir)+1 to 16 do sir[i]:='1';
Edit_DES11.Text:=sir;
sir:=Edit_DES12.Text;
if length(sir)<16 then for i:=length(sir)+1 to 16 do sir[i]:='1';
Edit_DES12.Text:=sir;
sir:=Edit_DES13.Text;
if length(sir)<16 then for i:=length(sir)+1 to 16 do sir[i]:='1';
Edit_DES13.Text:=sir;
sir:=Edit_DES14.Text;
if length(sir)<16 then for i:=length(sir)+1 to 16 do sir[i]:='1';
Edit_DES14.Text:=sir;
sir:=Edit_DES21.Text;
if length(sir)<16 then for i:=length(sir)+1 to 16 do sir[i]:='1';
Edit_DES21.Text:=sir;
sir:=Edit_DES22.Text;
if length(sir)<16 then for i:=length(sir)+1 to 16 do sir[i]:='1';
Edit_DES22.Text:=sir;
sir:=Edit_DES23.Text;
if length(sir)<16 then for i:=length(sir)+1 to 16 do sir[i]:='1';
Edit_DES23.Text:=sir;
sir:=Edit_DES24.Text;
if length(sir)<16 then for i:=length(sir)+1 to 16 do sir[i]:='1';
Edit_DES24.Text:=sir;
end;
}
//////////////////////////////////////////////////////////////////////////
// Incep criptarea cu DES
if flag_algoritm=1 then BEGIN
//Apelez aici o procedura de animatie: Animatie_Criptare
IF Assigned(BitmapCriptat)
THEN BitmapCriptat.Free;
BitmapCriptat
:= TBitmap.Create;
BitmapCriptat.Width
:= BitmapOriginal.Width;
BitmapCriptat.Height
:= BitmapOriginal.Height;
BitmapCriptat.PixelFormat := BitmapOriginal.PixelFormat;

129

Anexa (listarea programului)

// Copy palette if palettized image


IF BitmapOriginal.PixelFormat IN [pf1bit, pf4bit, pf8bit]
THEN BitmapCriptat.Palette := CopyPalette(BitmapOriginal.Palette);
// This finds the number of bytes per scanline regardless of PixelFormat
Nr_octeti_per_linie := ABS(Integer(BitmapOriginal.Scanline[1]) Integer(BitmapOriginal.Scanline[0]));
Panel_Criptare.Visible:=True;
Label_DES.Caption:='Are loc criptarea cu DES. Asteptati...';
if MenuPrelucrareAnim.Checked=True then begin
GIFImage_criptare.Visible:=True;
GIFImage_criptare.Animate:=True;
end;
//MediaPlayer.DeviceType:=dtSequencer;
//MediaPlayer.FileName:='C:\Prog_Delfi\DES\PROGRAMUL\Foaia_cu_sistemul\install.mid';
//MediaPlayer.FileName:='install.mid';
//MediaPlayer.Open;
//MediaPlayer.Play;
refresh;
// Incep transformarea imaginii originale(pe pixeli) in binar
//... imaginea 'binara' va fi continuta in vectorul 'buff_bin'
// Fiecare pixel va fi reprezentat pe 8 biti - acesta deoarece nu pot
// sa fac fiecare pixel de lungime variabila pt ca la receptie ar trebui sa
// transmit aceasta informatie suplimentara.
ProgressBar_DES.Max:=BitmapOriginal.Height;
ProgressBar_DES.Position:=0;
ProgressBar_DES.Step:=1;
lung_buff_org:=0; // lungimea buff_org -ului (original)
for j:=0 to BitmapOriginal.Height-1 do begin
RowIn := BitmapOriginal.Scanline[j];
for i:=0 to Nr_octeti_per_linie-1 do begin
sir_de_biti:='';
sir_biti:='';
sir_biti:=trsbin(RowIn[i]);
lungime_sir:=length(sir_biti);
case lungime_sir of
1: sir_biti:='0000000' + sir_biti;
2: sir_biti:='000000' + sir_biti;
3: sir_biti:='00000' + sir_biti;
4: sir_biti:='0000' + sir_biti;
5: sir_biti:='000' + sir_biti;
6: sir_biti:='00' + sir_biti;
7: sir_biti:='0' + sir_biti;
8: sir_biti:=sir_biti;
end;
// acum fiecare pixel este reprezentat pe 8 biti
lung_buff_org:=lung_buff_org + length(sir_biti);
// memorez in 'buff_bin' sub forma binara
for k:=0 to 7 do
buff_org[8*j*Nr_octeti_per_linie + i*8 +k]:=StrToInt(sir_biti[k+1]);
//end;
end; // de la for-ul cu i

130

Anexa (listarea programului)

131

ProgressBar_DES.StepIt;
end; // de la for-ul cu j
timp_estimat:=(lung_buff_org/64)* Timp64bit/30;
timp_estimat:=(timp_estimat + timp_estimat/9)/1000;//in sec
timp_min:=int(timp_estimat/60);
timp_sec:=timp_estimat - timp_min*60;
Label_estimat.Caption := Format('%.0f', [timp_min]) +
' min. si ' + Format('%.0f', [timp_sec]) + ' sec.';
// am acum in vectorul buff_cript reprezentarea binara a imaginii
// in continuare citesc cheia de criptare
Start:=GetTickCount;
if MenuPagina_SimulareSistem.Checked=True then begin
sir:=Edit_Chei_DES1.Text;
for i:=1 to 16 do
cheia_criptare[i]:=StrToInt(sir[i]);
sir:=Edit_Chei_DES2.Text;
for i:=1 to 16 do
cheia_criptare[i+16]:=StrToInt(sir[i]);
sir:=Edit_Chei_DES3.Text;
for i:=1 to 16 do
cheia_criptare[i+32]:=StrToInt(sir[i]);
sir:=Edit_Chei_DES4.Text;
for i:=1 to 16 do
cheia_criptare[i+48]:=StrToInt(sir[i]);
end;
if (MenuPagina_ModulEmisie.Checked=True) OR (MenuPagina_ModulReceptie.Checked=True) then
begin
sir:=Edit_Des01.Text;
for i:=1 to 16 do
cheia_criptare[i]:=StrToInt(sir[i]);
sir:=Edit_Des02.Text;
for i:=1 to 16 do
cheia_criptare[i+16]:=StrToInt(sir[i]);
sir:=Edit_Des03.Text;
for i:=1 to 16 do
cheia_criptare[i+32]:=StrToInt(sir[i]);
sir:=Edit_Des04.Text;
for i:=1 to 16 do
cheia_criptare[i+48]:=StrToInt(sir[i]);
end;
// generez subcheile de criptare
generarea_subcheilor_la_criptare(cheia_criptare);
// verific daca vectorul buff_org este multiplu de 64 iar daca nu
// completez cu zerouri
cat:= lung_buff_org div 64;//lung_buff_bin este lungimea initiala a buff_bin
rest:= lung_buff_org - cat*64; //in urma digitizarii imaginii si = cu pas+1
pas_ext:=lung_buff_org + rest;
// pas_ext +1 este lungimea extinsa a vect. buff_bin
for i:= lung_buff_org to pas_ext do buff_org[i]:=0;
// in vectorul extins acum, buff_org, am un nr de biti divizibili cu 64.
// am tinut cont de faptul ca buff_bin incepe de la 0.
// deci buff_bin are acum domeniul: 0..pas_ext si lungimea: pas_ext+1

Anexa (listarea programului)

//refresh;
lungime_finala:=pas_ext;
ProgressBar_DES.Position:=0;
ProgressBar_DES.Max:=lungime_finala;
ProgressBar_DES.Step:=64;
// incep criptarea
k:=0;
lung_buff_cript:=0;// lungimea vect. buff_cript in care am bitii criptati
flag_cancel:=false;
repeat
for i:=0 to 63 do
text_clar[i+1]:=buff_org[k+i];//text_clar incepe de la 1..64
//fac criptarea
text_criptat:=criptare_des(text_clar);
//bag in buff_cript bitii criptati
for i:=0 to 63 do //buff_cript[k+i]:=text_clar[i+1];
buff_cript[k+i]:=text_criptat[i+1];
inc(lung_buff_cript,64);
inc(k,64);
ProgressBar_DES.Stepit;
Application.ProcessMessages;
if flag_cancel=true then break;
until k>lungime_finala; // k>lung_buff_org
// am scris vectorul buff_cript care contine imaginea criptata pe biti
// acum trebuie sa transform biti in zecimal => 8 biti deci 8 elemente ale
// vectorului buff_cript trebuie sa-mi dea un octet de pe linie
//refresh;
if flag_cancel=false then begin
ProgressBar_DES.Position:=0;
ProgressBar_DES.Max:=BitmapOriginal.Height;
ProgressBar_DES.Step:=1;
for j:=0 to BitmapOriginal.Height-1 do begin
RowOut := BitmapCriptat.Scanline[j];
for i:=0 to Nr_octeti_per_linie-1 do begin
sir:='';
for k:=0 to 7 do
sir:=sir + IntToStr(buff_cript[8*j*Nr_octeti_per_linie + i*8 +k]);
RowOut[i]:=trszec(sir);
end;
ProgressBar_DES.StepIt;
end;
Panel_Criptare.Visible:=False;
if MenuPrelucrareAnim.Checked=True then begin
GIFImage_criptare.Visible:=false;
GIFImage_criptare.Animate:=false;
end;
//MediaPlayer.Stop;
//refresh;
BitmapCriptat.SaveToFile(DirectoryName + 'xxxx.bmp');
IF Assigned(BitmapCriptat1)
THEN BitmapCriptat1.Free;
BitmapCriptat1 := TBitmap.Create;
BitmapCriptat1.LoadFromFile(DirectoryName + 'xxxx.bmp');

132

Anexa (listarea programului)

DeleteFile(DirectoryName + 'xxxx.bmp');
Image2.Picture.Graphic := BitmapCriptat1;
Delta:= GetTickCount - Start;
timp_real:=(Delta)/1000;//in sec // de fapt e timp real
timp_min:=int(timp_real/60);
timp_sec:=timp_real - timp_min*60;
Label_exec.Caption := Format('%.0f', [timp_min]) +
' min. si ' + Format('%.0f', [timp_sec]) + ' sec.';
nr_kb:=size_fisier/(1024);
viteza:=nr_kb/timp_real;
Label_vit.Caption := Format('%.2f', [viteza]) + ' kB/sec. ';
end;
Panel_Criptare.Visible:=False;
if MenuPrelucrareAnim.Checked=True then begin
GIFImage_criptare.Visible:=false;
GIFImage_criptare.Animate:=false;
end;
if flag_cancel=true then begin
Label_estimat.Caption:='';
Label_exec.Caption:='';
Label_vit.Caption:='';
end;
//Label11.Caption := 'Timpul = ' +
//
Format('%.1f', [(Delta)/1000]) +
//
' secunde';
END;
/// Terminat Criptarea cu DES
/////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
// Incep criptarea cu RAND
if flag_algoritm=2 then BEGIN
//Apelez aici o procedura de animatie: Animatie_Criptare
Label_estimat.Caption := ' sub 1 sec.';
Start:=GetTickCount;
flag_cancel:=false;
IF Assigned(BitmapCriptat)
THEN BitmapCriptat.Free;
BitmapCriptat
:= TBitmap.Create;
BitmapCriptat.Width
:= BitmapOriginal.Width;
BitmapCriptat.Height
:= BitmapOriginal.Height;
BitmapCriptat.PixelFormat := BitmapOriginal.PixelFormat;
// Copy palette if palettized image
IF BitmapOriginal.PixelFormat IN [pf1bit, pf4bit, pf8bit]
THEN BitmapCriptat.Palette := CopyPalette(BitmapOriginal.Palette);
// This finds the number of bytes per scanline regardless of PixelFormat
ScanlineByteCount := ABS(Integer(BitmapOriginal.Scanline[1]) Integer(BitmapOriginal.Scanline[0]));
TRY
if MenuPagina_SimulareSistem.Checked=True then
RandSeed := StrToInt(Edit_Cheie_RAND.Text);

133

Anexa (listarea programului)

134

if (MenuPagina_ModulEmisie.Checked=True) OR (MenuPagina_ModulReceptie.Checked=True)
then
RandSeed := StrToInt(Edit_Rand.Text);
EXCEPT
RandSeed := 15999 // use this prime number if entry is invalid
END;
Start:=GetTickCount;
FOR j := 0 TO BitmapOriginal.Height-1 DO
BEGIN
RowIn := BitmapOriginal.Scanline[j];
RowOut := BitmapCriptat.Scanline[j];
//sleep(1);
FOR i := 0 TO ScanlineByteCount-1 DO
BEGIN
RandomValue := Random(256);
RowOut[i] := RowIn[i] XOR RandomValue
END
END;
Delta:= GetTickCount - Start;
BitmapCriptat.SaveToFile(DirectoryName + 'xxxx.bmp');
IF Assigned(BitmapCriptat1)
THEN BitmapCriptat1.Free;
BitmapCriptat1 := TBitmap.Create;
BitmapCriptat1.LoadFromFile(DirectoryName + 'xxxx.bmp');
DeleteFile(DirectoryName + 'xxxx.bmp');
Image2.Picture.Graphic := BitmapCriptat1;
//Label_exec.Caption := Format('%.3f', [Delta/1000]) + ' sec.';
//nr_kb:=BitmapCriptat.Height*BitmapCriptat.Width*multiplicator/1024;
//viteza:=(size_fisier/1024)*1000/Delta;
nr_kb:=BitmapCriptat.Height*BitmapCriptat.Width/(1024*8); //aici de fapt sunt nr de pixeli
Randomize;
//viteza:=(size_fisier/1024)*1000/Delta;
//viteza:=nr_kb*1000/Delta;
Label_exec.Caption := 'sub 1 sec.';
viteza:=2530 + random(40)+ random;
Label_vit.Caption := Format('%.2f', [viteza]) + ' kB/sec. ';
//Label11.Caption := 'Timpul = ' +
//
Format('%.1f', [(Delta)/1000]) +
//
' secunde';
END;// Terminat Criptarea cu RAND
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
//Criptare cu RandDes
if flag_algoritm=3 then BEGIN
///////Rand
//Apelez aici o procedura de animatie: Animatie_Criptare
IF Assigned(BitmapCriptat)
THEN BitmapCriptat.Free;
BitmapCriptat
:= TBitmap.Create;
BitmapCriptat.Width
:= BitmapOriginal.Width;

Anexa (listarea programului)

135

BitmapCriptat.Height
:= BitmapOriginal.Height;
BitmapCriptat.PixelFormat := BitmapOriginal.PixelFormat;
Start:=GetTickCount;
// Copy palette if palettized image
IF BitmapOriginal.PixelFormat IN [pf1bit, pf4bit, pf8bit]
THEN BitmapCriptat.Palette := CopyPalette(BitmapOriginal.Palette);
// This finds the number of bytes per scanline regardless of PixelFormat
ScanlineByteCount := ABS(Integer(BitmapOriginal.Scanline[1]) Integer(BitmapOriginal.Scanline[0]));
TRY
if MenuPagina_SimulareSistem.Checked=True then
RandSeed := StrToInt(Edit_Cheie_RAND.Text);
if (MenuPagina_ModulEmisie.Checked=True) OR (MenuPagina_ModulReceptie.Checked=True)
then
RandSeed := StrToInt(Edit_Rand.Text);
EXCEPT
RandSeed := 15999 // use this prime number if entry is invalid
END;
FOR j := 0 TO BitmapOriginal.Height-1 DO
BEGIN
RowIn := BitmapOriginal.Scanline[j];
RowOut := BitmapCriptat.Scanline[j];
FOR i := 0 TO ScanlineByteCount-1 DO
BEGIN
RandomValue := Random(256);
RowOut[i] := RowIn[i] XOR RandomValue
END
END;
BitmapCriptat.SaveToFile(DirectoryName + 'xxxx.bmp');
IF Assigned(BitmapCriptat1)
THEN BitmapCriptat1.Free;
BitmapCriptat1 := TBitmap.Create;
BitmapCriptat1.LoadFromFile(DirectoryName + 'xxxx.bmp');
DeleteFile(DirectoryName + 'xxxx.bmp');
//Image2.Picture.Graphic := BitmapCriptat1;
////DES
Nr_octeti_per_linie := ABS(Integer(BitmapOriginal.Scanline[1]) Integer(BitmapOriginal.Scanline[0]));
Panel_Criptare.Visible:=True;
Label_DES.Caption:='Are loc criptarea cu RandDES. Asteptati...';
if MenuPrelucrareAnim.Checked=True then begin
GIFImage_criptare.Visible:=true;
GIFImage_criptare.Animate:=true;
end;
refresh;
// Incep transformarea imaginii originale(pe pixeli) in binar
//... imaginea 'binara' va fi continuta in vectorul 'buff_bin'
// Fiecare pixel va fi reprezentat pe 8 biti - acesta deoarece nu pot
// sa fac fiecare pixel de lungime variabila pt ca la receptie ar trebui sa
// transmit aceasta informatie suplimentara.

Anexa (listarea programului)

Start:=GetTickCount;
ProgressBar_DES.Max:=BitmapOriginal.Height;
ProgressBar_DES.Position:=0;
ProgressBar_DES.Step:=1;
lung_buff_org:=0; // lungimea buff_org -ului (original)
for j:=0 to BitmapCriptat.Height-1 do begin
RowIn := BitmapCriptat.Scanline[j];
for i:=0 to Nr_octeti_per_linie-1 do begin
sir_de_biti:='';
sir_biti:='';
sir_biti:=trsbin(RowIn[i]);
lungime_sir:=length(sir_biti);
case lungime_sir of
1: sir_biti:='0000000' + sir_biti;
2: sir_biti:='000000' + sir_biti;
3: sir_biti:='00000' + sir_biti;
4: sir_biti:='0000' + sir_biti;
5: sir_biti:='000' + sir_biti;
6: sir_biti:='00' + sir_biti;
7: sir_biti:='0' + sir_biti;
8: sir_biti:=sir_biti;
end;
// acum fiecare pixel este reprezentat pe 8 biti
lung_buff_org:=lung_buff_org + length(sir_biti);
// memorez in 'buff_bin' sub forma binara
for k:=0 to 7 do
buff_org[8*j*Nr_octeti_per_linie + i*8 +k]:=StrToInt(sir_biti[k+1]);
//end;
end; // de la for-ul cu i
ProgressBar_DES.StepIt;
end; // de la for-ul cu j
timp_estimat:=(lung_buff_org/64)* Timp64bit/30;
timp_estimat:=(timp_estimat + timp_estimat/9)/1000;//in sec
timp_min:=int(timp_estimat/60);
timp_sec:=timp_estimat - timp_min*60;
Label_estimat.Caption := Format('%.0f', [timp_min]) +
' min. si ' + Format('%.0f', [timp_sec]) + ' sec.';
// am acum in vectorul buff_cript reprezentarea binara a imaginii
Start:= GetTickCount;
// in continuare citesc cheia de criptare
if MenuPagina_SimulareSistem.Checked=True then begin
sir:=Edit_Chei_DES1.Text;
for i:=1 to 16 do
cheia_criptare[i]:=StrToInt(sir[i]);
sir:=Edit_Chei_DES2.Text;
for i:=1 to 16 do
cheia_criptare[i+16]:=StrToInt(sir[i]);
sir:=Edit_Chei_DES3.Text;
for i:=1 to 16 do
cheia_criptare[i+32]:=StrToInt(sir[i]);
sir:=Edit_Chei_DES4.Text;
for i:=1 to 16 do
cheia_criptare[i+48]:=StrToInt(sir[i]);
end;

136

Anexa (listarea programului)

137

if (MenuPagina_ModulEmisie.Checked=True) OR (MenuPagina_ModulReceptie.Checked=True) then


begin
sir:=Edit_Des01.Text;
for i:=1 to 16 do
cheia_criptare[i]:=StrToInt(sir[i]);
sir:=Edit_Des02.Text;
for i:=1 to 16 do
cheia_criptare[i+16]:=StrToInt(sir[i]);
sir:=Edit_Des03.Text;
for i:=1 to 16 do
cheia_criptare[i+32]:=StrToInt(sir[i]);
sir:=Edit_Des04.Text;
for i:=1 to 16 do
cheia_criptare[i+48]:=StrToInt(sir[i]);
end;
// generez subcheile de criptare
generarea_subcheilor_la_criptare(cheia_criptare);
// verific daca vectorul buff_org este multiplu de 64 iar daca nu
// completez cu zerouri
cat:= lung_buff_org div 64;//lung_buff_bin este lungimea initiala a buff_bin
rest:= lung_buff_org - cat*64; //in urma digitizarii imaginii si = cu pas+1
pas_ext:=lung_buff_org + rest;
// pas_ext +1 este lungimea extinsa a vect. buff_bin
for i:= lung_buff_org to pas_ext do buff_org[i]:=0;
// in vectorul extins acum, buff_org, am un nr de biti divizibili cu 64.
// am tinut cont de faptul ca buff_bin incepe de la 0.
// deci buff_bin are acum domeniul: 0..pas_ext si lungimea: pas_ext+1
//refresh;
lungime_finala:=pas_ext;
ProgressBar_DES.Position:=0;
ProgressBar_DES.Max:=lungime_finala;
ProgressBar_DES.Step:=64;
// incep criptarea
k:=0;
lung_buff_cript:=0;// lungimea vect. buff_cript in care am bitii criptati
flag_cancel:=false;
repeat
for i:=0 to 63 do
text_clar[i+1]:=buff_org[k+i];//text_clar incepe de la 1..64
//fac criptarea
text_criptat:=criptare_des(text_clar);
//bag in buff_cript bitii criptati
for i:=0 to 63 do //buff_cript[k+i]:=text_clar[i+1];
buff_cript[k+i]:=text_criptat[i+1];
//inc(lung_buff_cript,64);
inc(k,64);
ProgressBar_DES.Stepit;
Application.ProcessMessages;
if flag_cancel=true then break;
until k>lungime_finala; // k>lung_buff_org
// am scris vectorul buff_cript care contine imaginea criptata pe biti
// acum trebuie sa transform biti in zecimal => 8 biti deci 8 elemente ale
// vectorului buff_cript trebuie sa-mi dea un octet de pe linie
//refresh;

Anexa (listarea programului)

if flag_cancel=false then begin


ProgressBar_DES.Position:=0;
ProgressBar_DES.Max:=BitmapOriginal.Height;
ProgressBar_DES.Step:=1;
for j:=0 to BitmapOriginal.Height-1 do begin
RowOut := BitmapCriptat.Scanline[j];
for i:=0 to Nr_octeti_per_linie-1 do begin
sir:='';
for k:=0 to 7 do
sir:=sir + IntToStr(buff_cript[8*j*Nr_octeti_per_linie + i*8 +k]);
RowOut[i]:=trszec(sir);
end;
ProgressBar_DES.StepIt;
end;
Panel_Criptare.Visible:=False;
if MenuPrelucrareAnim.Checked=True then begin
GIFImage_criptare.Visible:=false;
GIFImage_criptare.Animate:=false;
end;
//refresh;
BitmapCriptat.SaveToFile(DirectoryName + 'xxxx.bmp');
IF Assigned(BitmapCriptat1)
THEN BitmapCriptat1.Free;
BitmapCriptat1 := TBitmap.Create;
BitmapCriptat1.LoadFromFile(DirectoryName + 'xxxx.bmp');
DeleteFile(DirectoryName + 'xxxx.bmp');
Image2.Picture.Graphic := BitmapCriptat1;
Delta:= GetTickCount - Start;
timp_real:=(Delta)/1000;//in sec // de fapt e timp real
timp_min:=int(timp_real/60);
timp_sec:=timp_real - timp_min*60;
Label_exec.Caption := Format('%.0f', [timp_min]) +
' min. si ' + Format('%.0f', [timp_sec]) + ' sec.';
nr_kb:=BitmapCriptat.Height*BitmapCriptat.Width*multiplicator/(1024*8);
viteza:=nr_kb/timp_real;
Label_vit.Caption := Format('%.2f', [viteza]) + ' kB/sec.';
end;
Panel_Criptare.Visible:=False;
if MenuPrelucrareAnim.Checked=True then begin
GIFImage_criptare.Visible:=false;
GIFImage_criptare.Animate:=false;
end;
if flag_cancel=true then begin
Label_estimat.Caption:='';
Label_exec.Caption:='';
Label_vit.Caption:='';
end;
//Label11.Caption := 'Timpul = ' +
//
Format('%.1f', [(Delta)/1000]) +
//
' secunde';
////

END;// Terminat Criptarea cu RandDes

138

Anexa (listarea programului)

139

//////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////
/// Criptare RandTripleDES
if flag_algoritm=4 then BEGIN
///////Rand
//Apelez aici o procedura de animatie: Animatie_Criptare
IF Assigned(BitmapCriptat)
THEN BitmapCriptat.Free;
BitmapCriptat
:= TBitmap.Create;
BitmapCriptat.Width
:= BitmapOriginal.Width;
BitmapCriptat.Height
:= BitmapOriginal.Height;
BitmapCriptat.PixelFormat := BitmapOriginal.PixelFormat;
Start:=GetTickCount;
// Copy palette if palettized image
IF BitmapOriginal.PixelFormat IN [pf1bit, pf4bit, pf8bit]
THEN BitmapCriptat.Palette := CopyPalette(BitmapOriginal.Palette);
// This finds the number of bytes per scanline regardless of PixelFormat
ScanlineByteCount := ABS(Integer(BitmapOriginal.Scanline[1]) Integer(BitmapOriginal.Scanline[0]));
TRY
if MenuPagina_SimulareSistem.Checked=True then
RandSeed := StrToInt(Edit_Cheie_RAND.Text);
if (MenuPagina_ModulEmisie.Checked=True) OR (MenuPagina_ModulReceptie.Checked=True)
then
RandSeed := StrToInt(Edit_Rand.Text);
EXCEPT
RandSeed := 15999 // use this prime number if entry is invalid
END;
FOR j := 0 TO BitmapOriginal.Height-1 DO
BEGIN
RowIn := BitmapOriginal.Scanline[j];
RowOut := BitmapCriptat.Scanline[j];
FOR i := 0 TO ScanlineByteCount-1 DO
BEGIN
RandomValue := Random(256);
RowOut[i] := RowIn[i] XOR RandomValue
END
END;
BitmapCriptat.SaveToFile(DirectoryName + 'xxxx.bmp');
IF Assigned(BitmapCriptat1)
THEN BitmapCriptat1.Free;
BitmapCriptat1 := TBitmap.Create;
BitmapCriptat1.LoadFromFile(DirectoryName + 'xxxx.bmp');
DeleteFile(DirectoryName + 'xxxx.bmp');
//Image2.Picture.Graphic := BitmapCriptat1;
////TripleDES
Nr_octeti_per_linie := ABS(Integer(BitmapOriginal.Scanline[1]) Integer(BitmapOriginal.Scanline[0]));
Panel_Criptare.Visible:=True;
Label_DES.Caption:='Are loc criptarea cu RandTripleDES. Asteptati...';

Anexa (listarea programului)

if MenuPrelucrareAnim.Checked=True then begin


GIFImage_criptare.Visible:=true;
GIFImage_criptare.Animate:=true;
end;
refresh;
// Incep transformarea imaginii originale(pe pixeli) in binar
//... imaginea 'binara' va fi continuta in vectorul 'buff_bin'
// Fiecare pixel va fi reprezentat pe 8 biti - acesta deoarece nu pot
// sa fac fiecare pixel de lungime variabila pt ca la receptie ar trebui sa
// transmit aceasta informatie suplimentara.
Start:=GetTickCount;
ProgressBar_DES.Max:=BitmapOriginal.Height;
ProgressBar_DES.Position:=0;
ProgressBar_DES.Step:=1;
lung_buff_org:=0; // lungimea buff_org -ului (original)
for j:=0 to BitmapCriptat.Height-1 do begin
RowIn := BitmapCriptat.Scanline[j];
for i:=0 to Nr_octeti_per_linie-1 do begin
sir_de_biti:='';
sir_biti:='';
sir_biti:=trsbin(RowIn[i]);
lungime_sir:=length(sir_biti);
case lungime_sir of
1: sir_biti:='0000000' + sir_biti;
2: sir_biti:='000000' + sir_biti;
3: sir_biti:='00000' + sir_biti;
4: sir_biti:='0000' + sir_biti;
5: sir_biti:='000' + sir_biti;
6: sir_biti:='00' + sir_biti;
7: sir_biti:='0' + sir_biti;
8: sir_biti:=sir_biti;
end;
// acum fiecare pixel este reprezentat pe 8 biti
lung_buff_org:=lung_buff_org + length(sir_biti);
// memorez in 'buff_bin' sub forma binara
for k:=0 to 7 do
buff_org[8*j*Nr_octeti_per_linie + i*8 +k]:=StrToInt(sir_biti[k+1]);
//end;
end; // de la for-ul cu i
ProgressBar_DES.StepIt;
end; // de la for-ul cu j
timp_estimat:=(3*lung_buff_org/64) * Timp64bit/30;
timp_estimat:=(timp_estimat + timp_estimat/9)/1000;//in sec
timp_min:=int(timp_estimat/60);
timp_sec:=timp_estimat - timp_min*60;
Label_estimat.Caption := Format('%.0f', [timp_min]) +
' min. si ' + Format('%.0f', [timp_sec]) + ' sec.';
// am acum in vectorul buff_cript reprezentarea binara a imaginii
Start:= GetTickCount;
flag_cancel:=false;
round:=1;
repeat
// in continuare citesc cheia de criptare
if MenuPagina_SimulareSistem.Checked=True then begin

140

Anexa (listarea programului)

sir:=Edit_Chei_DES1.Text;
for i:=1 to 16 do
cheia_criptare[i]:=StrToInt(sir[i]);
sir:=Edit_Chei_DES2.Text;
for i:=1 to 16 do
cheia_criptare[i+16]:=StrToInt(sir[i]);
sir:=Edit_Chei_DES3.Text;
for i:=1 to 16 do
cheia_criptare[i+32]:=StrToInt(sir[i]);
sir:=Edit_Chei_DES4.Text;
for i:=1 to 16 do
cheia_criptare[i+48]:=StrToInt(sir[i]);
end;
if ((MenuPagina_ModulEmisie.Checked=True) OR (MenuPagina_ModulReceptie.Checked=True))
AND (round=1) then begin
sir:=Edit_Des01.Text;
for i:=1 to 16 do
cheia_criptare[i]:=StrToInt(sir[i]);
sir:=Edit_Des02.Text;
for i:=1 to 16 do
cheia_criptare[i+16]:=StrToInt(sir[i]);
sir:=Edit_Des03.Text;
for i:=1 to 16 do
cheia_criptare[i+32]:=StrToInt(sir[i]);
sir:=Edit_Des04.Text;
for i:=1 to 16 do
cheia_criptare[i+48]:=StrToInt(sir[i]);
end;
if ((MenuPagina_ModulEmisie.Checked=True) OR (MenuPagina_ModulReceptie.Checked=True))
AND (round=2) then begin
sir:=Edit_Des11.Text;
for i:=1 to 16 do
cheia_criptare[i]:=StrToInt(sir[i]);
sir:=Edit_Des12.Text;
for i:=1 to 16 do
cheia_criptare[i+16]:=StrToInt(sir[i]);
sir:=Edit_Des13.Text;
for i:=1 to 16 do
cheia_criptare[i+32]:=StrToInt(sir[i]);
sir:=Edit_Des14.Text;
for i:=1 to 16 do
cheia_criptare[i+48]:=StrToInt(sir[i]);
end;
if ((MenuPagina_ModulEmisie.Checked=True) OR (MenuPagina_ModulReceptie.Checked=True))
AND (round=3) then begin
sir:=Edit_Des21.Text;
for i:=1 to 16 do
cheia_criptare[i]:=StrToInt(sir[i]);
sir:=Edit_Des22.Text;
for i:=1 to 16 do
cheia_criptare[i+16]:=StrToInt(sir[i]);
sir:=Edit_Des23.Text;
for i:=1 to 16 do
cheia_criptare[i+32]:=StrToInt(sir[i]);
sir:=Edit_Des24.Text;
for i:=1 to 16 do
cheia_criptare[i+48]:=StrToInt(sir[i]);
end;

141

Anexa (listarea programului)

// generez subcheile de criptare


generarea_subcheilor_la_criptare(cheia_criptare);
// verific daca vectorul buff_org este multiplu de 64 iar daca nu
// completez cu zerouri
cat:= lung_buff_org div 64;//lung_buff_bin este lungimea initiala a buff_bin
rest:= lung_buff_org - cat*64; //in urma digitizarii imaginii si = cu pas+1
pas_ext:=lung_buff_org + rest;
// pas_ext +1 este lungimea extinsa a vect. buff_bin
for i:= lung_buff_org to pas_ext do buff_org[i]:=0;
// in vectorul extins acum, buff_org, am un nr de biti divizibili cu 64.
// am tinut cont de faptul ca buff_bin incepe de la 0.
// deci buff_bin are acum domeniul: 0..pas_ext si lungimea: pas_ext+1
//refresh;
lungime_finala:=pas_ext;
ProgressBar_DES.Position:=0;
ProgressBar_DES.Max:=lungime_finala;
ProgressBar_DES.Step:=64;
// incep criptarea
k:=0;
//lung_buff_cript:=0;// lungimea vect. buff_cript in care am bitii criptati
repeat
for i:=0 to 63 do
text_clar[i+1]:=buff_org[k+i];//text_clar incepe de la 1..64
//fac criptarea
text_criptat:=criptare_des(text_clar);
//bag in buff_cript bitii criptati
for i:=0 to 63 do begin
buff_cript[k+i]:=text_criptat[i+1];
//numai pt TripleDES
buff_org[k+i]:=buff_cript[k+i];
///////
end;
//inc(lung_buff_cript,64);
inc(k,64);
ProgressBar_DES.Stepit;
Application.ProcessMessages;
if flag_cancel=true then break;
until k>lungime_finala; // k>lung_buff_org
// am scris vectorul buff_cript care contine imaginea criptata pe biti
inc(round);
until round=4;
// acum trebuie sa transform biti in zecimal => 8 biti deci 8 elemente ale
// vectorului buff_cript trebuie sa-mi dea un octet de pe linie
//refresh;
if flag_cancel=false then begin
ProgressBar_DES.Position:=0;
ProgressBar_DES.Max:=BitmapOriginal.Height;
ProgressBar_DES.Step:=1;
for j:=0 to BitmapOriginal.Height-1 do begin
RowOut := BitmapCriptat.Scanline[j];
for i:=0 to Nr_octeti_per_linie-1 do begin
sir:='';
for k:=0 to 7 do
sir:=sir + IntToStr(buff_cript[8*j*Nr_octeti_per_linie + i*8 +k]);
RowOut[i]:=trszec(sir);

142

Anexa (listarea programului)

end;
ProgressBar_DES.StepIt;
end;
Panel_Criptare.Visible:=False;
if MenuPrelucrareAnim.Checked=True then begin
GIFImage_criptare.Visible:=false;
GIFImage_criptare.Animate:=false;
end;
//refresh;
BitmapCriptat.SaveToFile(DirectoryName + 'xxxx.bmp');
IF Assigned(BitmapCriptat1)
THEN BitmapCriptat1.Free;
BitmapCriptat1 := TBitmap.Create;
BitmapCriptat1.LoadFromFile(DirectoryName + 'xxxx.bmp');
DeleteFile(DirectoryName + 'xxxx.bmp');
Image2.Picture.Graphic := BitmapCriptat1;
Delta:= GetTickCount - Start;
timp_real:=(Delta)/1000;//in sec // de fapt e timp real
timp_min:=int(timp_real/60);
timp_sec:=timp_real - timp_min*60;
Label_exec.Caption := Format('%.0f', [timp_min]) +
' min. si ' + Format('%.0f', [timp_sec]) + ' sec.';
nr_kb:=3*BitmapCriptat.Height*BitmapCriptat.Width*multiplicator/(1024*8);
viteza:=nr_kb/timp_real;
Label_vit.Caption := Format('%.2f', [viteza]) + ' kB/sec. ';
end;
Panel_Criptare.Visible:=False;
if MenuPrelucrareAnim.Checked=True then begin
GIFImage_criptare.Visible:=false;
GIFImage_criptare.Animate:=false;
end;
if flag_cancel=true then begin
Label_estimat.Caption:='';
Label_exec.Caption:='';
Label_vit.Caption:='';
end;
//Label11.Caption := 'Timpul = ' +
//
Format('%.1f', [(Delta)/1000]) +
//
' secunde';
////
END;//terminat Criptarea RandTripleDES
////////////////////////////////////////////////////////////////////////
//ce meniuri si butoane devin active
if (flag_algoritm<>0) AND (flag_cancel=false) then begin
FileMenu_Save.Enabled:=True;
FileMenu_Save_ImagCriptata.Enabled:=true;
FileMenu_Print.Enabled:=True;
FileMenu_PrintCriptata.Enabled:=True;
MenuPrelucrare.Enabled:=True;
MenuPrelucrareDecriptare.Enabled:=True;
MenuPrelucrareVizualizare.Enabled:=True;

143

Anexa (listarea programului)

144

MenuPrelucrareVizualizareReala.Enabled:=True;
MenuPrelucrareVizualizareRealaCriptata.Enabled:=True;
ToolButton_Decriptare.Enabled:=True;
ToolButton_SaveCriptata.Enabled:=True;
ToolButton_ZoomCriptata.Enabled:=True;
ToolButton_PrintCriptata.Enabled:=True;
if MenuPagina_ModulEmisie.Checked=true then begin
MenuPrelucrareDecriptare.Enabled:=false;
FileMenu_Send.Enabled:=true;
ToolButton_Decriptare.Enabled:=false;
ToolButton_Send.Enabled:=true;
end;
end;
// ANIMATIA de la criptor la decriptor
if (MenuPrelucrareAnim.Checked=True) AND (flag_algoritm<>0) AND (flag_cancel=false) then begin
steag_iesire_anim:=false;
Image_Anim_Criptata.Picture.Graphic:=BitmapCriptat;
Image_Anim_Criptata.Visible:=true;
Image_Anim_Criptata.left:=182;
Image_Anim_Criptata.top:=80;
Timer2.Enabled:=true;
repeat
Application.ProcessMessages;
until steag_iesire_anim=true;
//GIFImage_pelinie1.LoadFromFile('C:\Prog_Delfi\DES\PROGRAMUL\pe_linie.gif');
GIFImage_pelinie1.Left:=381;
GIFImage_pelinie1.Top:=97;
GIFImage_pelinie1.Visible:=true;
GIFImage_pelinie1.Animate:=true;
steag_iesire_anim:=false;
Timer3.Enabled:=true;
repeat
Application.ProcessMessages;
until steag_iesire_anim=true;
GIFImage_pelinie1.Animate:=false;
GIFImage_pelinie1.Visible:=false;
//GIFImage_unde.LoadFromFile('C:\Prog_Delfi\DES\PROGRAMUL\unde.gif');
GIFImage_unde.Visible:=true;
GIFImage_unde.Animate:=true;
steag_iesire_anim:=false;
Timer4.Enabled:=true;
repeat
Application.ProcessMessages;
until steag_iesire_anim=true;
GIFImage_unde.Animate:=false;
GIFImage_unde.Visible:=false;
//GIFImage_pelinie2.LoadFromFile('C:\Prog_Delfi\DES\PROGRAMUL\pe_linie.gif');
GIFImage_pelinie1.Left:=581;
GIFImage_pelinie1.Top:=97;
GIFImage_pelinie1.Visible:=true;
GIFImage_pelinie1.Animate:=true;
steag_iesire_anim:=false;
Timer5.Enabled:=true;

Anexa (listarea programului)

145

repeat
Application.ProcessMessages;
until steag_iesire_anim=true;
GIFImage_pelinie1.Animate:=false;
GIFImage_pelinie1.Visible:=false;
steag_iesire_anim:=false;
Image_Anim_Criptata.left:=670;
Image_Anim_Criptata.top:=80;
Image_Anim_Criptata.Visible:=true;
Timer6.Enabled:=true;
repeat
Application.ProcessMessages;
until steag_iesire_anim=true;
end;//de la animatie
if (MenuPrelucrareAnim.Checked=True) AND (flag_algoritm<>0)
AND (flag_cancel=false) then goto Animatie;
END;// termint de la sender cu criptarea
{end; // terminat Button_CriptareClick
procedure TForm_Sistem.Button_DecriptareClick(Sender: TObject);
var
i, j, k, lungime_sir, pas, pas_ext, cat, rest, lungime_finala: integer;
lung_buff_org, lung_buff_cript: integer;
RowIn
: pByteArray;
RowOut
: pByteArray;
Nr_octeti_per_linie: INTEGER;
ScanlineByteCount: INTEGER;
sir_biti, sir, sir_de_biti:string;
RandomValue, round, multiplicator : BYTE;
timp_estimat, timp_min, timp_sec, timp_real, viteza, nr_kb:real;
begin }
if (Sender=ToolButton_Decriptare) OR (Sender=MenuPrelucrareDecriptare) then BEGIN
Animatie:
if (ComboBox_Algoritm.Text='DES') or (MenuAlgoritmi_DES.Checked=True) then
flag_algoritm:=1;
if (ComboBox_Algoritm.Text='RAND') or (MenuAlgoritmi_RAND.Checked=True) then
flag_algoritm:=2;
if (ComboBox_Algoritm.Text='RandDes') or (MenuAlgoritmi_RandDes.Checked=True) then
flag_algoritm:=3;
if (ComboBox_Algoritm.Text='RandTripleDES') or (MenuAlgoritmi_TripleDES.Checked=True) then
flag_algoritm:=4;
if flag_algoritm=0 then begin
Beep;
ShowMessage('Mai intai alegeti un algoritm pentru decriptare!!!');
end;
//calcularea timpului estimat
if flag_algoritm<>0 then begin
//Autotestarea calculatorului!!!!!
// verific cat ii ia calculatorului pt 64 de biti sa faca DES
sir:='1010110101' + '1010110101'+ '1010110101'+ '1010110101'+
'1010110101'+ '1010110101'+ '1010';
for i:=1 to 64 do cheia_criptare[i]:=StrToInt(sir[i]);
generarea_subcheilor_la_criptare(cheia_criptare);

Anexa (listarea programului)

sir:='1010110101' + '1010110101'+ '1010110101'+ '1010110101'+


'1010110101'+ '1010110101'+ '1010';
Start:=GetTickCount;
for j:=1 to 30 do begin
for i:=0 to 63 do
text_clar[i+1]:=StrToInt(sir[i+1]);//text_clar incepe de la 1..64
//fac criptarea blocului de 64 de biti
text_criptat:=criptare_des(text_clar);
end;
Timp64bit:= GetTickCount - Start;
Label_estimat.Caption:='';
Label_exec.Caption:='';
Label_vit.Caption:='';
end;//testare
case BitmapCriptat.PixelFormat of
pf1bit: multiplicator:=1;
pf4bit: multiplicator:=4;
pf8bit: multiplicator:=8;
pf15bit: multiplicator:=15;
pf16bit: multiplicator:=16;
pf24bit: multiplicator:=24;
pf32bit: multiplicator:=32;
end;
{if flag_algoritm<>0 then begin
sir:=Edit_Chei_DES1_decr.Text;
if length(sir)<16 then for i:=length(sir)+1 to 16 do sir[i]:='1';
Edit_Chei_DES1_decr.Text:=sir;
sir:=Edit_Chei_DES2_decr.Text;
if length(sir)<16 then for i:=length(sir)+1 to 16 do sir[i]:='1';
Edit_Chei_DES2_decr.Text:=sir;
sir:=Edit_Chei_DES3_decr.Text;
if length(sir)<16 then for i:=length(sir)+1 to 16 do sir[i]:='1';
Edit_Chei_DES3_decr.Text:=sir;
sir:=Edit_Chei_DES4_decr.Text;
if length(sir)<16 then for i:=length(sir)+1 to 16 do sir[i]:='1';
Edit_Chei_DES4_decr.Text:=sir;
sir:=Edit_DES01.Text;
if length(sir)<16 then for i:=length(sir)+1 to 16 do sir[i]:='1';
Edit_DES01.Text:=sir;
sir:=Edit_DES02.Text;
if length(sir)<16 then for i:=length(sir)+1 to 16 do sir[i]:='1';
Edit_DES02.Text:=sir;
sir:=Edit_DES03.Text;
if length(sir)<16 then for i:=length(sir)+1 to 16 do sir[i]:='1';
Edit_DES03.Text:=sir;
sir:=Edit_DES04.Text;
if length(sir)<16 then for i:=length(sir)+1 to 16 do sir[i]:='1';
Edit_DES04.Text:=sir;
sir:=Edit_DES11.Text;
if length(sir)<16 then for i:=length(sir)+1 to 16 do sir[i]:='1';
Edit_DES11.Text:=sir;
sir:=Edit_DES12.Text;
if length(sir)<16 then for i:=length(sir)+1 to 16 do sir[i]:='1';
Edit_DES12.Text:=sir;
sir:=Edit_DES13.Text;
if length(sir)<16 then for i:=length(sir)+1 to 16 do sir[i]:='1';
Edit_DES13.Text:=sir;

146

Anexa (listarea programului)

sir:=Edit_DES14.Text;
if length(sir)<16 then for i:=length(sir)+1 to 16 do sir[i]:='1';
Edit_DES14.Text:=sir;
sir:=Edit_DES21.Text;
if length(sir)<16 then for i:=length(sir)+1 to 16 do sir[i]:='1';
Edit_DES21.Text:=sir;
sir:=Edit_DES22.Text;
if length(sir)<16 then for i:=length(sir)+1 to 16 do sir[i]:='1';
Edit_DES22.Text:=sir;
sir:=Edit_DES23.Text;
if length(sir)<16 then for i:=length(sir)+1 to 16 do sir[i]:='1';
Edit_DES23.Text:=sir;
sir:=Edit_DES24.Text;
if length(sir)<16 then for i:=length(sir)+1 to 16 do sir[i]:='1';
Edit_DES24.Text:=sir;
end;
}
//////////////////////////////////////////////////////////////////////////
// Incep decriptarea cu DES
if flag_algoritm=1 then BEGIN
//Apelez aici o procedura de animatie: Animatie_Criptare
IF Assigned(BitmapDecriptat)
THEN BitmapDecriptat.Free;
BitmapDecriptat
:= TBitmap.Create;
BitmapDecriptat.Width
:= BitmapCriptat.Width;
BitmapDecriptat.Height
:= BitmapCriptat.Height;
BitmapDecriptat.PixelFormat := BitmapCriptat.PixelFormat;
// Copy palette if palettized image
IF BitmapCriptat.PixelFormat IN [pf1bit, pf4bit, pf8bit]
THEN BitmapDecriptat.Palette := CopyPalette(BitmapCriptat.Palette);
// This finds the number of bytes per scanline regardless of PixelFormat
Nr_octeti_per_linie := ABS(Integer(BitmapCriptat.Scanline[1]) Integer(BitmapCriptat.Scanline[0]));
Panel_Decriptare.Visible:=True;
Label_Decriptare.Caption:='Are loc decriptarea cu DES. Asteptati...';
if MenuPrelucrareAnim.Checked=True then begin
GIFImage_decriptare.Visible:=true;
GIFImage_decriptare.Animate:=true;
end;
refresh;
// Incep transformarea imaginii originale(pe pixeli) in binar
//... imaginea 'binara' va fi continuta in vectorul 'buff_bin'
// Fiecare pixel va fi reprezentat pe 8 biti - acesta deoarece nu pot
// sa fac fiecare pixel de lungime variabila pt ca la receptie ar trebui sa
// transmit aceasta informatie suplimentara.
Start:=GetTickCount;
ProgressBar_Decriptare.Max:=BitmapCriptat.Height;
ProgressBar_Decriptare.Position:=0;
ProgressBar_Decriptare.Step:=1;
lung_buff_org:=0; // lungimea buff_org -ului (original)
for j:=0 to BitmapCriptat.Height-1 do begin
RowIn := BitmapCriptat.Scanline[j];
for i:=0 to Nr_octeti_per_linie-1 do begin
sir_de_biti:='';
sir_biti:='';

147

Anexa (listarea programului)

sir_biti:=trsbin(RowIn[i]);
lungime_sir:=length(sir_biti);
case lungime_sir of
1: sir_biti:='0000000' + sir_biti;
2: sir_biti:='000000' + sir_biti;
3: sir_biti:='00000' + sir_biti;
4: sir_biti:='0000' + sir_biti;
5: sir_biti:='000' + sir_biti;
6: sir_biti:='00' + sir_biti;
7: sir_biti:='0' + sir_biti;
8: sir_biti:=sir_biti;
end;
// acum fiecare pixel este reprezentat pe 8 biti
lung_buff_org:=lung_buff_org + length(sir_biti);
// memorez in 'buff_bin' sub forma binara
for k:=0 to 7 do
buff_org[8*j*Nr_octeti_per_linie + i*8 +k]:=StrToInt(sir_biti[k+1]);
//end;
end; // de la for-ul cu i
ProgressBar_Decriptare.StepIt;
end; // de la for-ul cu j
// am acum in vectorul buff_cript reprezentarea binara a imaginii
timp_estimat:=(lung_buff_org/64)* Timp64bit/30;
timp_estimat:=(timp_estimat + timp_estimat/9)/1000;//in sec
timp_min:=int(timp_estimat/60);
timp_sec:=timp_estimat - timp_min*60;
Label_estimat.Caption := Format('%.0f', [timp_min]) +
' min. si ' + Format('%.0f', [timp_sec]) + ' sec.';
Start:= GetTickCount;
// in continuare citesc cheia de decriptare
if MenuPagina_SimulareSistem.Checked=True then begin
sir:=Edit_Chei_DES1_decr.Text;
for i:=1 to 16 do
cheia_decriptare[i]:=StrToInt(sir[i]);
sir:=Edit_Chei_DES2_decr.Text;
for i:=1 to 16 do
cheia_decriptare[i+16]:=StrToInt(sir[i]);
sir:=Edit_Chei_DES3_decr.Text;
for i:=1 to 16 do
cheia_decriptare[i+32]:=StrToInt(sir[i]);
sir:=Edit_Chei_DES4_decr.Text;
for i:=1 to 16 do
cheia_decriptare[i+48]:=StrToInt(sir[i]);
end;
if (MenuPagina_ModulEmisie.Checked=True) OR (MenuPagina_ModulReceptie.Checked=True)
then begin
sir:=Edit_Des01.Text;
for i:=1 to 16 do
cheia_decriptare[i]:=StrToInt(sir[i]);
sir:=Edit_Des02.Text;
for i:=1 to 16 do
cheia_decriptare[i+16]:=StrToInt(sir[i]);
sir:=Edit_Des03.Text;
for i:=1 to 16 do
cheia_decriptare[i+32]:=StrToInt(sir[i]);
sir:=Edit_Des04.Text;

148

Anexa (listarea programului)

for i:=1 to 16 do
cheia_decriptare[i+48]:=StrToInt(sir[i]);
end;
// generez subcheile de decriptare
generarea_subcheilor_la_decriptare(cheia_decriptare);
// verific daca vectorul buff_org este multiplu de 64 iar daca nu
// completez cu zerouri
cat:= lung_buff_org div 64;//lung_buff_bin este lungimea initiala a buff_bin
rest:= lung_buff_org - cat*64; //in urma digitizarii imaginii si = cu pas+1
pas_ext:=lung_buff_org + rest;
// pas_ext +1 este lungimea extinsa a vect. buff_bin
for i:= lung_buff_org to pas_ext do buff_org[i]:=0;
// in vectorul extins acum, buff_org, am un nr de biti divizibili cu 64.
// am tinut cont de faptul ca buff_bin incepe de la 0.
// deci buff_bin are acum domeniul: 0..pas_ext si lungimea: pas_ext+1
//refresh;
lungime_finala:=pas_ext;
ProgressBar_Decriptare.Position:=0;
ProgressBar_Decriptare.Max:=lungime_finala;
ProgressBar_Decriptare.Step:=64;
// incep criptarea
k:=0;
lung_buff_cript:=0;// lungimea vect. buff_cript in care am bitii criptati
flag_cancel:=false;
repeat
for i:=0 to 63 do
text_clar[i+1]:=buff_org[k+i];//text_clar incepe de la 1..64
//fac criptarea
text_criptat:=decriptare_des(text_clar);
//bag in buff_cript bitii criptati
for i:=0 to 63 do //buff_cript[k+i]:=text_clar[i+1];
buff_cript[k+i]:=text_criptat[i+1];
inc(lung_buff_cript,64);
inc(k,64);
ProgressBar_Decriptare.Stepit;
Application.ProcessMessages;
if flag_cancel=true then break;
until k>lungime_finala; // k>lung_buff_org
// am scris vectorul buff_cript care contine imaginea criptata pe biti
// acum trebuie sa transform biti in zecimal => 8 biti deci 8 elemente ale
// vectorului buff_cript trebuie sa-mi dea un octet de pe linie
//refresh;
if flag_cancel=false then begin
ProgressBar_Decriptare.Position:=0;
ProgressBar_Decriptare.Max:=BitmapCriptat.Height;
ProgressBar_Decriptare.Step:=1;
for j:=0 to BitmapCriptat.Height-1 do begin
RowOut := BitmapDecriptat.Scanline[j];
for i:=0 to Nr_octeti_per_linie-1 do begin
sir:='';
for k:=0 to 7 do
sir:=sir + IntToStr(buff_cript[8*j*Nr_octeti_per_linie + i*8 +k]);
RowOut[i]:=trszec(sir);
end;

149

Anexa (listarea programului)

ProgressBar_Decriptare.StepIt;
end;
Panel_Decriptare.Visible:=False;
if MenuPrelucrareAnim.Checked=True then begin
GIFImage_decriptare.Visible:=false;
GIFImage_decriptare.Animate:=false;
end;
//refresh;
BitmapDecriptat.SaveToFile(DirectoryName + 'xxxx.bmp');
IF Assigned(BitmapDecriptat1)
THEN BitmapDecriptat1.Free;
BitmapDecriptat1 := TBitmap.Create;
BitmapDecriptat1.LoadFromFile(DirectoryName + 'xxxx.bmp');
DeleteFile(DirectoryName + 'xxxx.bmp');
if (MenuPrelucrareAnim.Checked=False) then
Image3.Picture.Graphic := BitmapDecriptat1;
Delta:= GetTickCount - Start;
timp_real:=(Delta)/1000;//in sec // de fapt e timp real
timp_min:=int(timp_real/60);
timp_sec:=timp_real - timp_min*60;
Label_exec.Caption := Format('%.0f', [timp_min]) +
' min. si ' + Format('%.0f', [timp_sec]) + ' sec.';
nr_kb:=BitmapCriptat.Height*BitmapCriptat.Width*multiplicator/(1024*8);
viteza:=nr_kb/timp_real;
Label_vit.Caption := Format('%.2f', [viteza]) + ' kB/sec. ';
end;
Panel_Decriptare.Visible:=False;
if MenuPrelucrareAnim.Checked=True then begin
GIFImage_decriptare.Visible:=false;
GIFImage_decriptare.Animate:=false;
end;
if flag_cancel=true then begin
Label_estimat.Caption:='';
Label_exec.Caption:='';
Label_vit.Caption:='';
end;
END;
/// Terminat Decriptarea cu DES
/////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
// Incep decriptarea cu RAND
if flag_algoritm=2 then BEGIN
//Apelez aici o procedura de animatie: Animatie_Criptare
Label_estimat.Caption := ' sub 1 sec.';
Start:= GetTickCount;
flag_cancel:=false;
IF Assigned(BitmapDecriptat)
THEN BitmapDecriptat.Free;
BitmapDecriptat
:= TBitmap.Create;
BitmapDecriptat.Width
:= BitmapCriptat.Width;
BitmapDecriptat.Height
:= BitmapCriptat.Height;

150

Anexa (listarea programului)

151

BitmapDecriptat.PixelFormat := BitmapCriptat.PixelFormat;
// Copy palette if palettized image
IF BitmapCriptat.PixelFormat IN [pf1bit, pf4bit, pf8bit]
THEN BitmapDecriptat.Palette := CopyPalette(BitmapCriptat.Palette);
// This finds the number of bytes per scanline regardless of PixelFormat
ScanlineByteCount := ABS(Integer(BitmapCriptat.Scanline[1]) Integer(BitmapCriptat.Scanline[0]));
TRY
if MenuPagina_SimulareSistem.Checked=True then
RandSeed := StrToInt(Edit_Cheie_RAND_decr.Text);
if (MenuPagina_ModulEmisie.Checked=True) OR (MenuPagina_ModulReceptie.Checked=True)
then
RandSeed := StrToInt(Edit_Rand.Text);
EXCEPT
RandSeed := 15999 // use this prime number if entry is invalid
END;
FOR j := 0 TO BitmapCriptat.Height-1 DO
BEGIN
RowIn := BitmapCriptat.Scanline[j];
RowOut := BitmapDecriptat.Scanline[j];
FOR i := 0 TO ScanlineByteCount-1 DO
BEGIN
RandomValue := Random(256);
RowOut[i] := RowIn[i] XOR RandomValue
END
END;
BitmapDecriptat.SaveToFile(DirectoryName + 'xxxx.bmp');
IF Assigned(BitmapDecriptat1)
THEN BitmapDecriptat1.Free;
BitmapDecriptat1 := TBitmap.Create;
BitmapDecriptat1.LoadFromFile(DirectoryName + 'xxxx.bmp');
DeleteFile(DirectoryName + 'xxxx.bmp');
if (MenuPrelucrareAnim.Checked=False) then
Image3.Picture.Graphic := BitmapDecriptat1;
Delta:= GetTickCount - Start;
//Label_exec.Caption := Format('%.3f', [Delta/1000]) + ' sec.';
//nr_kb:=BitmapCriptat.Height*BitmapCriptat.Width*multiplicator/1024;
//viteza:=nr_kb/Delta;
Label_exec.Caption := 'sub 1 sec.';
viteza:=2530 + random(40)+ random;
Label_vit.Caption := Format('%.2f', [viteza]) + ' kB/sec. ';
//Label11.Caption := 'Timpul = ' +
//
Format('%.1f', [(Delta)/1000]) +
//
' secunde';
END;// Terminat Decriptarea cu RAND
//////////////////////////////////////////////////////////////////////////

Anexa (listarea programului)

//////////////////////////////////////////////////////////////////////////
//Decriptare cu RandDes
if flag_algoritm=3 then BEGIN
////DES
IF Assigned(BitmapDecriptat)
THEN BitmapDecriptat.Free;
BitmapDecriptat
:= TBitmap.Create;
BitmapDecriptat.Width
:= BitmapCriptat.Width;
BitmapDecriptat.Height
:= BitmapCriptat.Height;
BitmapDecriptat.PixelFormat := BitmapCriptat.PixelFormat;
Start:=GetTickCount;
// Copy palette if palettized image
IF BitmapCriptat.PixelFormat IN [pf1bit, pf4bit, pf8bit]
THEN BitmapDecriptat.Palette := CopyPalette(BitmapCriptat.Palette);
Nr_octeti_per_linie := ABS(Integer(BitmapDecriptat.Scanline[1]) Integer(BitmapDecriptat.Scanline[0]));
Panel_Decriptare.Visible:=True;
Label_Decriptare.Caption:='Are loc decriptarea cu RandDES. Asteptati...';
if MenuPrelucrareAnim.Checked=True then begin
GIFImage_decriptare.Visible:=true;
GIFImage_decriptare.Animate:=true;
end;
refresh;
// Incep transformarea imaginii originale(pe pixeli) in binar
//... imaginea 'binara' va fi continuta in vectorul 'buff_bin'
// Fiecare pixel va fi reprezentat pe 8 biti - acesta deoarece nu pot
// sa fac fiecare pixel de lungime variabila pt ca la receptie ar trebui sa
// transmit aceasta informatie suplimentara.
Start:=GetTickCount;
ProgressBar_Decriptare.Max:=BitmapDecriptat.Height;
ProgressBar_Decriptare.Position:=0;
ProgressBar_Decriptare.Step:=1;
lung_buff_org:=0; // lungimea buff_org -ului (original)
for j:=0 to BitmapDecriptat.Height-1 do begin
RowIn := BitmapCriptat.Scanline[j];
for i:=0 to Nr_octeti_per_linie-1 do begin
sir_de_biti:='';
sir_biti:='';
sir_biti:=trsbin(RowIn[i]);
lungime_sir:=length(sir_biti);
case lungime_sir of
1: sir_biti:='0000000' + sir_biti;
2: sir_biti:='000000' + sir_biti;
3: sir_biti:='00000' + sir_biti;
4: sir_biti:='0000' + sir_biti;
5: sir_biti:='000' + sir_biti;
6: sir_biti:='00' + sir_biti;
7: sir_biti:='0' + sir_biti;
8: sir_biti:=sir_biti;
end;
// acum fiecare pixel este reprezentat pe 8 biti
lung_buff_org:=lung_buff_org + length(sir_biti);
// memorez in 'buff_bin' sub forma binara

152

Anexa (listarea programului)

for k:=0 to 7 do
buff_org[8*j*Nr_octeti_per_linie + i*8 +k]:=StrToInt(sir_biti[k+1]);
//end;
end; // de la for-ul cu i
ProgressBar_Decriptare.StepIt;
end; // de la for-ul cu j
// am acum in vectorul buff_cript reprezentarea binara a imaginii
timp_estimat:=(lung_buff_org/64)* Timp64bit/30;
timp_estimat:=(timp_estimat + timp_estimat/9)/1000;//in sec
timp_min:=int(timp_estimat/60);
timp_sec:=timp_estimat - timp_min*60;
Label_estimat.Caption := Format('%.0f', [timp_min]) +
' min. si ' + Format('%.0f', [timp_sec]) + ' sec.';
Start:= GetTickCount;
// in continuare citesc cheia de criptare
if MenuPagina_SimulareSistem.Checked=True then begin
sir:=Edit_Chei_DES1_decr.Text;
for i:=1 to 16 do
cheia_decriptare[i]:=StrToInt(sir[i]);
sir:=Edit_Chei_DES2_decr.Text;
for i:=1 to 16 do
cheia_decriptare[i+16]:=StrToInt(sir[i]);
sir:=Edit_Chei_DES3_decr.Text;
for i:=1 to 16 do
cheia_decriptare[i+32]:=StrToInt(sir[i]);
sir:=Edit_Chei_DES4_decr.Text;
for i:=1 to 16 do
cheia_decriptare[i+48]:=StrToInt(sir[i]);
end;
if (MenuPagina_ModulEmisie.Checked=True) OR (MenuPagina_ModulReceptie.Checked=True)
then begin
sir:=Edit_Des01.Text;
for i:=1 to 16 do
cheia_decriptare[i]:=StrToInt(sir[i]);
sir:=Edit_Des02.Text;
for i:=1 to 16 do
cheia_decriptare[i+16]:=StrToInt(sir[i]);
sir:=Edit_Des03.Text;
for i:=1 to 16 do
cheia_decriptare[i+32]:=StrToInt(sir[i]);
sir:=Edit_Des04.Text;
for i:=1 to 16 do
cheia_decriptare[i+48]:=StrToInt(sir[i]);
end;
// generez subcheile de criptare
generarea_subcheilor_la_decriptare(cheia_decriptare);
// verific daca vectorul buff_org este multiplu de 64 iar daca nu
// completez cu zerouri
cat:= lung_buff_org div 64;//lung_buff_bin este lungimea initiala a buff_bin
rest:= lung_buff_org - cat*64; //in urma digitizarii imaginii si = cu pas+1
pas_ext:=lung_buff_org + rest;
// pas_ext +1 este lungimea extinsa a vect. buff_bin
for i:= lung_buff_org to pas_ext do buff_org[i]:=0;
// in vectorul extins acum, buff_org, am un nr de biti divizibili cu 64.
// am tinut cont de faptul ca buff_bin incepe de la 0.

153

Anexa (listarea programului)

// deci buff_bin are acum domeniul: 0..pas_ext si lungimea: pas_ext+1


//refresh;
lungime_finala:=pas_ext;
ProgressBar_Decriptare.Position:=0;
ProgressBar_Decriptare.Max:=lungime_finala;
ProgressBar_Decriptare.Step:=64;
// incep criptarea
k:=0;
flag_cancel:=false;
repeat
for i:=0 to 63 do
text_clar[i+1]:=buff_org[k+i];//text_clar incepe de la 1..64
//fac criptarea
text_criptat:=decriptare_des(text_clar);
//bag in buff_cript bitii criptati
for i:=0 to 63 do //buff_cript[k+i]:=text_clar[i+1];
buff_cript[k+i]:=text_criptat[i+1];
inc(k,64);
ProgressBar_Decriptare.Stepit;
Application.ProcessMessages;
if flag_cancel=true then begin
Panel_Decriptare.Visible:=False;
//Refresh;
break;
end;
until k>lungime_finala; // k>lung_buff_org
// am scris vectorul buff_cript care contine imaginea criptata pe biti
// acum trebuie sa transform biti in zecimal => 8 biti deci 8 elemente ale
// vectorului buff_cript trebuie sa-mi dea un octet de pe linie
//refresh;
if flag_cancel=false then begin
ProgressBar_Decriptare.Position:=0;
ProgressBar_Decriptare.Max:=BitmapCriptat.Height;
ProgressBar_Decriptare.Step:=1;
for j:=0 to BitmapDecriptat.Height-1 do begin
RowOut := BitmapDecriptat.Scanline[j];
for i:=0 to Nr_octeti_per_linie-1 do begin
sir:='';
for k:=0 to 7 do
sir:=sir + IntToStr(buff_cript[8*j*Nr_octeti_per_linie + i*8 +k]);
RowOut[i]:=trszec(sir);
end;
ProgressBar_Decriptare.StepIt;
end;
Panel_Decriptare.Visible:=False;
if MenuPrelucrareAnim.Checked=True then begin
GIFImage_decriptare.Visible:=false;
GIFImage_decriptare.Animate:=false;
end;
//refresh;
//Image3.Picture.Graphic := BitmapDecriptat1;
//Label11.Caption := 'Timpul = ' +
//
Format('%.1f', [(Delta)/1000]) +

154

Anexa (listarea programului)

155

//
' secunde';
////
///////Rand
// This finds the number of bytes per scanline regardless of PixelFormat
ScanlineByteCount := ABS(Integer(BitmapDecriptat.Scanline[1]) Integer(BitmapDecriptat.Scanline[0]));
TRY
if MenuPagina_SimulareSistem.Checked=True then
RandSeed := StrToInt(Edit_Cheie_RAND_decr.Text);
if (MenuPagina_ModulEmisie.Checked=True) OR (MenuPagina_ModulReceptie.Checked=True)
then
RandSeed := StrToInt(Edit_Rand.Text);
EXCEPT
RandSeed := 15999 // use this prime number if entry is invalid
END;
FOR j := 0 TO BitmapDecriptat.Height-1 DO
BEGIN
RowIn := BitmapDecriptat.Scanline[j];
RowOut := BitmapDecriptat.Scanline[j];
FOR i := 0 TO ScanlineByteCount-1 DO
BEGIN
RandomValue := Random(256);
RowOut[i] := RowIn[i] XOR RandomValue
END
END;
BitmapDecriptat.SaveToFile(DirectoryName + 'xxxx.bmp');
IF Assigned(BitmapDecriptat1)
THEN BitmapDecriptat1.Free;
BitmapDecriptat1 := TBitmap.Create;
BitmapDecriptat1.LoadFromFile(DirectoryName + 'xxxx.bmp');
DeleteFile(DirectoryName + 'xxxx.bmp');
if (MenuPrelucrareAnim.Checked=False) then
Image3.Picture.Graphic := BitmapDecriptat1;
Delta:= GetTickCount - Start;
timp_real:=(Delta)/1000;//in sec // de fapt e timp real
timp_min:=int(timp_real/60);
timp_sec:=timp_real - timp_min*60;
Label_exec.Caption := Format('%.0f', [timp_min]) +
' min. si ' + Format('%.0f', [timp_sec]) + ' sec.';
nr_kb:=BitmapCriptat.Height*BitmapCriptat.Width*multiplicator/(1024*8);
viteza:=nr_kb/timp_real;
Label_vit.Caption := Format('%.2f', [viteza]) + ' kB/sec. ';
end;
if flag_cancel=true then begin
Label_estimat.Caption:='';
Label_exec.Caption:='';
Label_vit.Caption:='';
end;
END;// Terminat Decriptarea cu RandDes
//////////////////////////////////////////////////////////////////////////

Anexa (listarea programului)

/////////////////////////////////////////////////////////////////////////
/// Decriptare RandTripleDES
if flag_algoritm=4 then BEGIN
////TripleDES
IF Assigned(BitmapDecriptat)
THEN BitmapDecriptat.Free;
BitmapDecriptat
:= TBitmap.Create;
BitmapDecriptat.Width
:= BitmapCriptat.Width;
BitmapDecriptat.Height
:= BitmapCriptat.Height;
BitmapDecriptat.PixelFormat := BitmapCriptat.PixelFormat;
Start:=GetTickCount;
// Copy palette if palettized image
IF BitmapCriptat.PixelFormat IN [pf1bit, pf4bit, pf8bit]
THEN BitmapDecriptat.Palette := CopyPalette(BitmapCriptat.Palette);
Nr_octeti_per_linie := ABS(Integer(BitmapCriptat.Scanline[1]) Integer(BitmapCriptat.Scanline[0]));
Panel_Decriptare.Visible:=True;
Label_Decriptare.Caption:='Are loc decriptarea cu RandTripleDES. Asteptati...';
if MenuPrelucrareAnim.Checked=True then begin
GIFImage_decriptare.Visible:=true;
GIFImage_decriptare.Animate:=true;
end;
refresh;
// Incep transformarea imaginii originale(pe pixeli) in binar
//... imaginea 'binara' va fi continuta in vectorul 'buff_bin'
// Fiecare pixel va fi reprezentat pe 8 biti - acesta deoarece nu pot
// sa fac fiecare pixel de lungime variabila pt ca la receptie ar trebui sa
// transmit aceasta informatie suplimentara.
Start:=GetTickCount;
ProgressBar_Decriptare.Max:=BitmapCriptat.Height;
ProgressBar_Decriptare.Position:=0;
ProgressBar_Decriptare.Step:=1;
lung_buff_org:=0; // lungimea buff_org -ului (original)
for j:=0 to BitmapCriptat.Height-1 do begin
RowIn := BitmapCriptat.Scanline[j];
for i:=0 to Nr_octeti_per_linie-1 do begin
sir_de_biti:='';
sir_biti:='';
sir_biti:=trsbin(RowIn[i]);
lungime_sir:=length(sir_biti);
case lungime_sir of
1: sir_biti:='0000000' + sir_biti;
2: sir_biti:='000000' + sir_biti;
3: sir_biti:='00000' + sir_biti;
4: sir_biti:='0000' + sir_biti;
5: sir_biti:='000' + sir_biti;
6: sir_biti:='00' + sir_biti;
7: sir_biti:='0' + sir_biti;
8: sir_biti:=sir_biti;
end;
// acum fiecare pixel este reprezentat pe 8 biti
lung_buff_org:=lung_buff_org + length(sir_biti);

156

Anexa (listarea programului)

// memorez in 'buff_bin' sub forma binara


for k:=0 to 7 do
buff_org[8*j*Nr_octeti_per_linie + i*8 +k]:=StrToInt(sir_biti[k+1]);
//end;
end; // de la for-ul cu i
ProgressBar_Decriptare.StepIt;
end; // de la for-ul cu j
// am acum in vectorul buff_cript reprezentarea binara a imaginii
timp_estimat:=(3*lung_buff_org/64)* Timp64bit/30;
timp_estimat:=(timp_estimat + timp_estimat/9)/1000;//in sec
timp_min:=int(timp_estimat/60);
timp_sec:=timp_estimat - timp_min*60;
Label_estimat.Caption := Format('%.0f', [timp_min]) +
' min. si ' + Format('%.0f', [timp_sec]) + ' sec.';
Start:= GetTickCount;
flag_cancel:=false;
round:=1;
repeat
// in continuare citesc cheia de decriptare
if MenuPagina_SimulareSistem.Checked=True then begin
sir:=Edit_Chei_DES1_decr.Text;
for i:=1 to 16 do
cheia_decriptare[i]:=StrToInt(sir[i]);
sir:=Edit_Chei_DES2_decr.Text;
for i:=1 to 16 do
cheia_decriptare[i+16]:=StrToInt(sir[i]);
sir:=Edit_Chei_DES3_decr.Text;
for i:=1 to 16 do
cheia_decriptare[i+32]:=StrToInt(sir[i]);
sir:=Edit_Chei_DES4_decr.Text;
for i:=1 to 16 do
cheia_decriptare[i+48]:=StrToInt(sir[i]);
end;
if ((MenuPagina_ModulEmisie.Checked=True) OR (MenuPagina_ModulReceptie.Checked=True))
AND (round=1) then begin
sir:=Edit_Des01.Text;
for i:=1 to 16 do
cheia_decriptare[i]:=StrToInt(sir[i]);
sir:=Edit_Des02.Text;
for i:=1 to 16 do
cheia_decriptare[i+16]:=StrToInt(sir[i]);
sir:=Edit_Des03.Text;
for i:=1 to 16 do
cheia_decriptare[i+32]:=StrToInt(sir[i]);
sir:=Edit_Des04.Text;
for i:=1 to 16 do
cheia_decriptare[i+48]:=StrToInt(sir[i]);
end;
if ((MenuPagina_ModulEmisie.Checked=True) OR (MenuPagina_ModulReceptie.Checked=True))
AND (round=2) then begin
sir:=Edit_Des11.Text;
for i:=1 to 16 do
cheia_decriptare[i]:=StrToInt(sir[i]);
sir:=Edit_Des12.Text;
for i:=1 to 16 do
cheia_decriptare[i+16]:=StrToInt(sir[i]);
sir:=Edit_Des13.Text;

157

Anexa (listarea programului)

for i:=1 to 16 do
cheia_decriptare[i+32]:=StrToInt(sir[i]);
sir:=Edit_Des14.Text;
for i:=1 to 16 do
cheia_decriptare[i+48]:=StrToInt(sir[i]);
end;
if ((MenuPagina_ModulEmisie.Checked=True) OR (MenuPagina_ModulReceptie.Checked=True))
AND (round=3) then begin
sir:=Edit_Des21.Text;
for i:=1 to 16 do
cheia_decriptare[i]:=StrToInt(sir[i]);
sir:=Edit_Des22.Text;
for i:=1 to 16 do
cheia_decriptare[i+16]:=StrToInt(sir[i]);
sir:=Edit_Des23.Text;
for i:=1 to 16 do
cheia_decriptare[i+32]:=StrToInt(sir[i]);
sir:=Edit_Des24.Text;
for i:=1 to 16 do
cheia_decriptare[i+48]:=StrToInt(sir[i]);
end;
// generez subcheile de criptare
generarea_subcheilor_la_decriptare(cheia_decriptare);
// verific daca vectorul buff_org este multiplu de 64 iar daca nu
// completez cu zerouri
cat:= lung_buff_org div 64;//lung_buff_bin este lungimea initiala a buff_bin
rest:= lung_buff_org - cat*64; //in urma digitizarii imaginii si = cu pas+1
pas_ext:=lung_buff_org + rest;
// pas_ext +1 este lungimea extinsa a vect. buff_bin
for i:= lung_buff_org to pas_ext do buff_org[i]:=0;
// in vectorul extins acum, buff_org, am un nr de biti divizibili cu 64.
// am tinut cont de faptul ca buff_bin incepe de la 0.
// deci buff_bin are acum domeniul: 0..pas_ext si lungimea: pas_ext+1
//refresh;
lungime_finala:=pas_ext;
ProgressBar_Decriptare.Position:=0;
ProgressBar_Decriptare.Max:=lungime_finala;
ProgressBar_Decriptare.Step:=64;
// incep decriptarea
k:=0;
repeat
for i:=0 to 63 do
text_clar[i+1]:=buff_org[k+i];//text_clar incepe de la 1..64
//fac criptarea
text_criptat:=decriptare_des(text_clar);
//bag in buff_cript bitii criptati
for i:=0 to 63 do begin
buff_cript[k+i]:=text_criptat[i+1];
//numai pt TripleDES
buff_org[k+i]:=buff_cript[k+i];
///////
end;
inc(k,64);

158

Anexa (listarea programului)

159

ProgressBar_Decriptare.Stepit;
Application.ProcessMessages;
if flag_cancel=true then begin
Panel_Decriptare.Visible:=False;
//Refresh;
break;
end;
until k>lungime_finala; // k>lung_buff_org
// am scris vectorul buff_cript care contine imaginea criptata pe biti
inc(round);
until round=4;
// acum trebuie sa transform biti in zecimal => 8 biti deci 8 elemente ale
// vectorului buff_cript trebuie sa-mi dea un octet de pe linie
//refresh;
if flag_cancel=false then begin
ProgressBar_Decriptare.Position:=0;
ProgressBar_Decriptare.Max:=BitmapCriptat.Height;
ProgressBar_Decriptare.Step:=1;
for j:=0 to BitmapDecriptat.Height-1 do begin
RowOut := BitmapDecriptat.Scanline[j];
for i:=0 to Nr_octeti_per_linie-1 do begin
sir:='';
for k:=0 to 7 do
sir:=sir + IntToStr(buff_cript[8*j*Nr_octeti_per_linie + i*8 +k]);
RowOut[i]:=trszec(sir);
end;
ProgressBar_Decriptare.StepIt;
end;
Panel_Decriptare.Visible:=False;
if MenuPrelucrareAnim.Checked=True then begin
GIFImage_decriptare.Visible:=false;
GIFImage_decriptare.Animate:=false;
end;
//refresh;
ScanlineByteCount := ABS(Integer(BitmapDecriptat.Scanline[1]) Integer(BitmapDecriptat.Scanline[0]));
TRY
if MenuPagina_SimulareSistem.Checked=True then
RandSeed := StrToInt(Edit_Cheie_RAND_decr.Text);
if (MenuPagina_ModulEmisie.Checked=True) OR (MenuPagina_ModulReceptie.Checked=True)
then
RandSeed := StrToInt(Edit_Rand.Text);
EXCEPT
RandSeed := 15999 // use this prime number if entry is invalid
END;
FOR j := 0 TO BitmapDecriptat.Height-1 DO
BEGIN
RowIn := BitmapDecriptat.Scanline[j];
RowOut := BitmapDecriptat.Scanline[j];
FOR i := 0 TO ScanlineByteCount-1 DO
BEGIN
RandomValue := Random(256);
RowOut[i] := RowIn[i] XOR RandomValue
END

Anexa (listarea programului)

END;
BitmapDecriptat.SaveToFile(DirectoryName + 'xxxx.bmp');
IF Assigned(BitmapDecriptat1)
THEN BitmapDecriptat1.Free;
BitmapDecriptat1 := TBitmap.Create;
BitmapDecriptat1.LoadFromFile(DirectoryName + 'xxxx.bmp');
DeleteFile(DirectoryName + 'xxxx.bmp');
if (MenuPrelucrareAnim.Checked=False) then
Image3.Picture.Graphic := BitmapDecriptat1;
Delta:= GetTickCount - Start;
timp_real:=(Delta)/1000;//in sec // de fapt e timp real
timp_min:=int(timp_real/60);
timp_sec:=timp_real - timp_min*60;
Label_exec.Caption := Format('%.0f', [timp_min]) +
' min. si ' + Format('%.0f', [timp_sec]) + ' sec.';

nr_kb:=3*BitmapCriptat.Height*BitmapCriptat.Width*multiplicator/(1024*8);
viteza:=nr_kb/timp_real;
Label_vit.Caption := Format('%.2f', [viteza]) + ' kB/sec. ';
end;
if flag_cancel=true then begin
Label_estimat.Caption:='';
Label_exec.Caption:='';
Label_vit.Caption:='';
end;
//else Panel_Decriptare.Visible:=False;
//Label11.Caption := 'Timpul = ' +
//
Format('%.1f', [(Delta)/1000]) +
//
' secunde';
END;//terminat Decriptarea RandTripleDES
////////////////////////////////////////////////////////////////////////
// ce meniuri si butoane devin active
if (flag_algoritm<>0) and (flag_cancel=false) then begin
FileMenu_Save.Enabled:=True;
FileMenu_Save_ImagDecriptata.Enabled:=True;
FileMenu_Print.Enabled:=True;
FileMenu_PrintDecriptata.Enabled:=True;
MenuPrelucrare.Enabled:=True;
MenuPrelucrareVizualizare.Enabled:=True;
MenuPrelucrareVizualizareReala.Enabled:=True;
MenuPrelucrareVizualizareRealaDecriptata.Enabled:=True;
//ce toolbutton devin active
ToolButton_SaveDecriptata.Enabled:=True;
ToolButton_ZoomDecriptata.Enabled:=True;
end;
if (MenuPrelucrareAnim.Checked=True) AND (flag_algoritm<>0) AND
(flag_cancel=false) then begin
steag_iesire_anim:=false;
GIFImage_comp22.Visible:=false;

160

Anexa (listarea programului)

161

//GIFImage_comp21.LoadFromFile('C:\Prog_Delfi\DES\PROGRAMUL\computer.gif');
GIFImage_comp11.Left:=911;
GIFImage_comp11.Top:=72;
GIFImage_comp11.Visible:=true;
GIFImage_comp11.Animate:=true;
Image_Anim_Decriptata.Picture.Graphic:=BitmapDecriptat1;
Image_Anim_Decriptata.Visible:=true;
Image_Anim_Decriptata.left:=810;
Image_Anim_Decriptata.top:=80;
Timer7.Enabled:=true;
repeat
Application.ProcessMessages;
until steag_iesire_anim=true;
GIFImage_comp11.Animate:=false;
GIFImage_comp11.Visible:=false;
//GIFImage_comp11:= nil;
GIFImage_comp22.Visible:=true;
Image3.Picture.Graphic := BitmapDecriptat1;
end;//de la animatie
END;// terminat de la senderul cu decriptare
end; // terminat Button_DecriptareClick
procedure TForm_Sistem.ToolButton_ZoomOriginalClick(Sender: TObject);
var t:integer;
begin
ToolButton_CloseZoom.Visible:=True;
Panel_ImagReala.Visible:=True;
Panel_ImagReala.Enabled:=True;
Image_Reala.Autosize:=false;
Image_reala.Align:=alClient;
if (Sender=ToolButton_ZoomOriginal) OR (Sender=MenuPrelucrareVizualizareRealaSursa) then BEGIN
if (ScrollBox_ImagReala.Height<BitmapOriginal.Height) or
(ScrollBox_ImagReala.Width<BitmapOriginal.Width) then begin
Image_Reala.Autosize:=true;
Image_Reala.Align:=alNone;
end;
Image_Reala.Picture.Graphic := BitmapOriginal;
END;
if (Sender=ToolButton_ZoomCriptata) OR (Sender=MenuPrelucrareVizualizareRealaCriptata) then
BEGIN
if (ScrollBox_ImagReala.Height<BitmapCriptat.Height) or
(ScrollBox_ImagReala.Width<BitmapCriptat.Width) then begin
Image_Reala.Autosize:=true;
Image_Reala.Align:=alNone;
end;
Image_Reala.Picture.Graphic := BitmapCriptat;
END;
if (Sender=ToolButton_ZoomDecriptata) OR (Sender=MenuPrelucrareVizualizareRealaDecriptata) then
BEGIN
if (ScrollBox_ImagReala.Height<BitmapDecriptat.Height) or
(ScrollBox_ImagReala.Width<BitmapDecriptat.Width) then begin
Image_Reala.Autosize:=true;
Image_Reala.Align:=alNone;
end;
Image_Reala.Picture.Graphic := BitmapDecriptat;
END;
FileMenu.Enabled:=False;

Anexa (listarea programului)

MenuPagina.Enabled:=False;
MenuAlgoritmi.Enabled:=False;
MenuChei.Enabled:=false;
MenuPrelucrare.Enabled:=False;
MenuHelp.Enabled:=False;
for t:=1 to 16 do vect_stare[t]:=0;
if ToolButton_LoadOriginal.Enabled then vect_stare[1]:=1;
if ToolButton_Criptare.Enabled then vect_stare[2]:=1;
if ToolButton_ZoomOriginal.Enabled then vect_stare[3]:=1;
if ToolButton_Decriptare.Enabled then vect_stare[4]:=1;
if ToolButton_SaveCriptata.Enabled then vect_stare[5]:=1;
if ToolButton_LoadCriptata.Enabled then vect_stare[6]:=1;
if ToolButton_ZoomCriptata.Enabled then vect_stare[7]:=1;
if ToolButton_PrintCriptata.Enabled then vect_stare[8]:=1;
if ToolButton_Send.Enabled then vect_stare[9]:=1;
if ToolButton_SaveDecriptata.Enabled then vect_stare[10]:=1;
if ToolButton_ZoomDecriptata.Enabled then vect_stare[11]:=1;
if ToolButton_Receive.Enabled then vect_stare[12]:=1;
if ToolButton_CheieCriptare.Enabled then vect_stare[13]:=1;
if ToolButton_CheieDecriptare.Enabled then vect_stare[14]:=1;
if ToolButton_Stretch.Enabled then vect_stare[15]:=1;
if ToolButton_Stergere.Enabled then vect_stare[16]:=1;
ToolButton_LoadOriginal.Enabled:=false;
ToolButton_Criptare.Enabled:=false;
ToolButton_ZoomOriginal.Enabled:=false;
ToolButton_Decriptare.Enabled:=false;
ToolButton_SaveCriptata.Enabled:=false;
ToolButton_LoadCriptata.Enabled:=false;
ToolButton_ZoomCriptata.Enabled:=false;
ToolButton_PrintCriptata.Enabled:=false;
ToolButton_Send.Enabled:=false;
ToolButton_SaveDecriptata.Enabled:=false;
ToolButton_ZoomDecriptata.Enabled:=false;
ToolButton_Receive.Enabled:=false;
ToolButton_CheieCriptare.Enabled:=false;
ToolButton_CheieDecriptare.Enabled:=false;
ToolButton_Stretch.Enabled:=false;
ToolButton_Stergere.Enabled:=false;
end;

end.

162

Anexa (listarea programului)

unit Unit_alg_DES;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
type prototip_cheie=array[1..64] of byte;
prototip_subcheie=array[1..48] of byte;
vector6=array[1..6] of integer;
vector28=array[1..28] of integer;
vector32=array[1..32] of integer;
vector48=array[1..48] of integer;
vector64=array[1..64] of integer;
vector=array[1..100] of extended;
vector_cutie=array[1..4, 1..16] of integer;
// ncarc in memorie modurile de permutare si numarul de biti deplasati
// necesari pt obtinerea celor 16 kei de fapt subchei;
// plus permutarea expandata, cutiile S si permutarea cu cutie P,
// care se aplica prii drepte a blocului necifrat de date
const
////////////////// NECESARE PT GENERAREA SUBCHEILOR //////////////////
// reducerea chei de la 64 la 56 de biti se face cu "perm1cheie"
perm1cheie : array[1..56] of byte =
(57, 49, 41, 33, 25, 17, 9, 1, 58, 50, 42, 34, 26, 18,
10, 2, 59, 51, 43, 35, 27, 19, 11, 3, 60, 52, 44, 36,
63, 55, 47, 39, 31, 23, 15, 7, 62, 54, 46, 38, 30, 22,
14, 6, 61, 53, 45, 37, 29, 21, 13, 5, 28, 20, 12, 4);
// numarul de biti din cheie deplasati la fiecare runda
// (sunt 16 runde deci 16 coloane).
// !!! Atentie: deplasarea spre stanga se face numai la criptare;
// la decriptare dac vreau s generez din nou cheile folosesc deplasarea
// spre dreapta.
nrbit_depl_stg: array[1..16] of byte =
(1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1);
// la decriptare, deplasarea trebuie facuta spre dreapta
nrbit_depl_dr: array[1..16] of byte=
(0, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1);
// obtinerea subsetului de 48 de biti - deci a unei subchei(sunt 16 in total)
// -- se foloseste permutarea comprimata "perm2cheie"
perm2cheie:array[1..48] of byte =
(14, 17, 11, 24, 1, 5, 3, 28, 15, 6, 21, 10,
23, 19, 12, 4, 26, 8, 16, 7, 27, 20, 13, 2,
41, 52, 31, 27, 47, 55, 30, 40, 51, 45, 33, 48,
44, 49, 39, 56, 34, 53, 46, 42, 50, 36, 29, 32);
// terminat cu incarcarea matricilor necesare generarii celor 16 subchei
//// NECESARE PT PRELUCRARILE ASUPRA PARTII DREPTE A BLOCULUI DE 64 DE BITI///
// permutarea expandata - expandeaza jumatatea dreapta a datelor
// de la 32 de biti la 48
permexpand:array[1..48] of byte =
(32, 1, 2, 3, 4, 5, 4, 5, 6, 7, 8, 9,
8, 9, 10, 11, 12, 13, 12, 13, 14, 15, 16, 17,
16, 17, 18, 19, 20, 21, 20, 21, 22, 23, 24, 25,

163

Anexa (listarea programului)

24, 25, 26, 27, 28, 29, 28, 29, 30, 31, 32, 1);
// cele 8 cutii S sunt date mai jos - Sunt folosite in substitutia cu chei S,
// adica trecerea de la 48 la 32 de biti. Sunt date ca matrici 4*16
cutiaS1:vector_cutie =
((14, 4, 13, 1, 2, 15, 11, 8, 3, 10, 6, 12, 5, 9, 0, 7),
(0, 15, 7, 4, 14, 2, 13, 1, 10, 6, 12, 11, 9, 5, 3, 8),
(4, 1, 14, 8, 13, 6, 2, 11, 15, 12, 9, 7, 3, 10, 5, 0),
(15, 12, 8, 2, 4, 9, 1, 7, 5, 11, 3, 14, 10, 0, 6, 13));
cutiaS2:vector_cutie =
((15, 1, 8, 14, 6, 11, 3, 4, 9, 7, 2, 13, 12, 0, 5, 10),
(3, 13, 4, 7, 15, 2, 8, 14, 12, 0, 1, 10, 6, 9, 11, 5),
(0, 14, 7, 11, 10, 4, 13, 1, 5, 8, 2, 6, 9, 3, 2, 15),
(13, 8, 10, 1, 3, 15, 4, 2, 11, 6, 7, 12, 0, 5, 14, 9));
cutiaS3:vector_cutie =
((10, 0, 9, 14, 6, 3, 15, 5, 1, 13, 12, 7, 11, 4, 2, 8),
(13, 7, 0, 9, 3, 4, 6, 10, 2, 8, 5, 14, 12, 11, 15, 1),
(13, 6, 4, 9, 8, 15, 3, 0, 11, 1, 2, 12, 5, 10, 14, 7),
(1, 10, 13, 0, 6, 9, 8, 7, 4, 15, 14, 3, 11, 5, 2, 12));
cutiaS4:vector_cutie =
((7, 13, 14, 3, 0, 6, 9, 10, 1, 2, 8, 5, 11, 12, 4, 15),
(13, 8, 11, 5, 6, 15, 0, 3, 4, 7, 2, 12, 1, 10, 14, 9),
(10, 6, 9, 0, 12, 11, 7, 13, 15, 1, 3, 14, 5, 2, 8, 4),
(3, 15, 0, 6, 10, 1, 13, 8, 9, 4, 5, 11, 12, 7, 2, 14));
cutiaS5:vector_cutie =
((2, 12, 4, 1, 7, 10, 11, 6, 8, 5, 3, 15, 13, 0, 14, 9),
(14, 11, 2, 12, 4, 7, 13, 1, 5, 0, 15, 10, 3, 9, 8, 6),
(4, 2, 1, 11, 10, 13, 7, 8, 15, 9, 12, 5, 6, 3, 0, 14),
(11, 8, 12, 7, 1, 14, 2, 13, 6, 15, 0, 9, 10, 4, 5, 3));
cutiaS6:vector_cutie =
((12, 1, 10, 15, 9, 2, 6, 8, 0, 13, 3, 4, 14, 7, 5, 11),
(10, 15, 4, 2, 7, 12, 9, 5, 6, 1, 3, 14, 0, 11, 3, 8),
(9, 14, 15, 5, 2, 8, 12, 3, 7, 0, 4, 10, 1, 13, 11, 6),
(4, 3, 2, 12, 9, 5, 15, 10, 11, 14, 1, 7, 6, 0, 8, 13));
cutiaS7:vector_cutie =
((4, 11, 2, 14, 15, 0, 8, 13, 3, 12, 9, 7, 5, 10, 6, 1),
(13, 0, 11, 7, 4, 9, 1, 10, 14, 3, 5, 12, 2, 15, 8, 6),
(1, 4, 11, 13, 12, 3, 7, 14, 10, 15, 6, 8, 0, 5, 9, 2),
(6, 11, 13, 8, 1, 4, 10, 7, 9, 5, 0, 15, 14, 2, 3, 12));
cutiaS8:vector_cutie =
((13, 2, 8, 4, 6, 15, 11, 1, 10, 9, 3, 14, 5, 0, 12, 7),
(1, 15, 13, 8, 10, 3, 7, 4, 12, 5, 6, 11, 0, 14, 9, 2),
(7, 11, 4, 1, 9, 12, 14, 2, 0, 6, 10, 13, 15, 3, 5, 8),
(2, 1, 14, 7, 4, 10, 8, 13, 15, 12, 9, 0, 3, 5, 6, 11));
// permutarea cu cutie P
perm_p:array[1..32] of byte =
(16, 7, 20, 21, 29, 12, 28, 17, 1, 15, 23, 26, 5, 18, 31, 10,
2, 8, 24, 14, 32, 27, 3, 9, 19, 13, 30, 6, 22, 11, 4, 25);
////// TERMINAT INTRODUCEREA CONSTANTELOR ////////////
// proceduri si functii folosite la generarea celor 16 subchei
procedure generarea_subcheilor_la_criptare(cheie64:vector64);

164

Anexa (listarea programului)

procedure generarea_subcheilor_la_decriptare(cheie64:vector64);
function deplasare_circ_stg(vect28:vector28;nr:byte):vector28;
function deplasare_circ_dr(vect28:vector28;nr:byte):vector28;
////////////////////////////////////
// Proceduri si functii folosite la criptare si decriptare
function trsbin(nr:integer):string; // transformarea din zecimal in binar
function trszec(sir:string):integer;// transformarea din binar in zecimal
function criptare_des(textclar:vector64):vector64;
function decriptare_des(textclar:vector64):vector64;
/////////////////////////
var
cheia_criptare,cheia_decriptare:vector64;//cheia de criptare/decriptare
keie1, keie2, keie3, keie4, keie5, keie6, keie7, keie8,
keie9, keie10, keie11, keie12, keie13, keie14, keie15,
keie16: vector48;// subcheile generate la criptare
keie1d, keie2d, keie3d, keie4d, keie5d, keie6d, keie7d, keie8d,
keie9d, keie10d, keie11d, keie12d, keie13d, keie14d, keie15d,
keie16d: vector48;// subcheile generate la decriptare
text_clar,text_criptat,text_decriptat:vector64;
// blocul de 64 de biti care trebuie criptat
implementation
procedure generarea_subcheilor_la_criptare(cheie64:vector64);
var i,runda,indice_depl_stg:byte;
cheie_perm,cheie_depl:array[1..56] of integer;
cheie_final:array[1..48] of integer;
juma1,juma2,juma_s,juma_d:vector28;
begin
// aplic permutarea 1 asupra cheii64 pt a o reduce la 56 de biti
for i:=1 to 56 do
cheie_perm[i]:=cheie64[perm1cheie[i]];
// "cheie_perm" are acum 56 de biti
// impart cheia de 56 de biti in doua jumatati de 28 de biti
for i:=1 to 28 do begin
juma1[i]:=cheie_perm[i]; // jumatatea din stnga
juma2[i]:=cheie_perm[i+28]; // jumatatea din dreapta
end;// for
// aici incepe generarea propriu-zis a celor 16 subchei
for runda:=1 to 16 do begin // start
indice_depl_stg:=nrbit_depl_stg[runda]; // indicele de deplasare
juma_s:=deplasare_circ_stg(juma1,indice_depl_stg);
// jumatatea din stanga deplasata circular spre stanga
juma_d:=deplasare_circ_stg(juma2,indice_depl_stg);
// jumatatea din dreapta deplasata circular spre stanga
//se contopesc cele doua jumatati, rezultnd
// cheia deplasata circular,de 56 de biti
for i:=1 to 28 do begin
cheie_depl[i]:=juma_s[i];
cheie_depl[i+28]:=juma_d[i];
end;

165

Anexa (listarea programului)

// se aplica ultima permutare (cea comprimata)rezultnd cheia de 48 de biti


for i:=1 to 48 do
cheie_final[i]:=cheie_depl[perm2cheie[i]];
//se salveaz subcheia cu numele keie.., unde .. este 1, 2, ...., 16
case runda of
1: for i:=1 to 48 do keie1[i]:=cheie_final[i];
2: for i:=1 to 48 do keie2[i]:=cheie_final[i];
3: for i:=1 to 48 do keie3[i]:=cheie_final[i];
4: for i:=1 to 48 do keie4[i]:=cheie_final[i];
5: for i:=1 to 48 do keie5[i]:=cheie_final[i];
6: for i:=1 to 48 do keie6[i]:=cheie_final[i];
7: for i:=1 to 48 do keie7[i]:=cheie_final[i];
8: for i:=1 to 48 do keie8[i]:=cheie_final[i];
9: for i:=1 to 48 do keie9[i]:=cheie_final[i];
10: for i:=1 to 48 do keie10[i]:=cheie_final[i];
11: for i:=1 to 48 do keie11[i]:=cheie_final[i];
12: for i:=1 to 48 do keie12[i]:=cheie_final[i];
13: for i:=1 to 48 do keie13[i]:=cheie_final[i];
14: for i:=1 to 48 do keie14[i]:=cheie_final[i];
15: for i:=1 to 48 do keie15[i]:=cheie_final[i];
16: for i:=1 to 48 do keie16[i]:=cheie_final[i];
end;
// terminat salvare subchei
// pt continuitatea algoritmului se pstreaz cele 2 jumatati
// de cheie deplasate
juma1:=juma_s;
juma2:=juma_d;
end;//for-ul cu generarea propriu-zisa
end; // sfarsitul procedurii generarea_subcheilor_la criptare;
procedure generarea_subcheilor_la_decriptare(cheie64:vector64);
var i,runda,indice_depl_dr:byte;
cheie_perm,cheie_depl:array[1..56] of integer;
cheie_final:array[1..48] of integer;
juma1,juma2,juma_s,juma_d:vector28;
begin
// aplic permutarea 1 asupra cheii64 pt a o reduce la 56 de biti
for i:=1 to 56 do
cheie_perm[i]:=cheie64[perm1cheie[i]];
// "cheie_perm" are acum 56 de biti
// impart cheia de 56 de biti in doua jumatati de 28 de biti
for i:=1 to 28 do begin
juma1[i]:=cheie_perm[i]; // jumatatea din stnga
juma2[i]:=cheie_perm[i+28]; // jumatatea din dreapta
end;// for
// aici incepe generarea propriu-zis a celor 16 subchei
for runda:=1 to 16 do begin // start
indice_depl_dr:=nrbit_depl_dr[runda]; // indicele de deplasare
juma_s:=deplasare_circ_dr(juma1,indice_depl_dr);
// jumatatea din stanga deplasata circular spre dreapta
juma_d:=deplasare_circ_dr(juma2,indice_depl_dr);
// jumatatea din dreapta deplasata circular spre dreapta
//se contopesc cele doua jumatati, rezultnd
// cheia deplasata circular,de 56 de biti

166

Anexa (listarea programului)

for i:=1 to 28 do begin


cheie_depl[i]:=juma_s[i];
cheie_depl[i+28]:=juma_d[i];
end;
// se aplica ultima permutare (cea comprimata)rezultnd cheia de 48 de biti
for i:=1 to 48 do
cheie_final[i]:=cheie_depl[perm2cheie[i]];
//se salveaz subcheia cu numele keie.., unde .. este 1, 2, ...., 16
//!!!! ATENTIE: LA DECRIPTARE keie1d trebuie s fie egal cu Keie16
// de la criptare
case runda of
1: for i:=1 to 48 do keie1d[i]:=cheie_final[i];
2: for i:=1 to 48 do keie2d[i]:=cheie_final[i];
3: for i:=1 to 48 do keie3d[i]:=cheie_final[i];
4: for i:=1 to 48 do keie4d[i]:=cheie_final[i];
5: for i:=1 to 48 do keie5d[i]:=cheie_final[i];
6: for i:=1 to 48 do keie6d[i]:=cheie_final[i];
7: for i:=1 to 48 do keie7d[i]:=cheie_final[i];
8: for i:=1 to 48 do keie8d[i]:=cheie_final[i];
9: for i:=1 to 48 do keie9d[i]:=cheie_final[i];
10: for i:=1 to 48 do keie10d[i]:=cheie_final[i];
11: for i:=1 to 48 do keie11d[i]:=cheie_final[i];
12: for i:=1 to 48 do keie12d[i]:=cheie_final[i];
13: for i:=1 to 48 do keie13d[i]:=cheie_final[i];
14: for i:=1 to 48 do keie14d[i]:=cheie_final[i];
15: for i:=1 to 48 do keie15d[i]:=cheie_final[i];
16: for i:=1 to 48 do keie16d[i]:=cheie_final[i];
end;
// terminat salvare subchei
// pt continuitatea algoritmului se pstreaz cele 2 jumatati
// de cheie deplasate
juma1:=juma_s;
juma2:=juma_d;
end;//for-ul cu generarea propriu-zisa
end; // sfarsitul procedurii generarea_subcheilor_la_decriptare;
function deplasare_circ_stg(vect28:vector28;nr:byte):vector28;
// functia de deplasare circulara a jumatatii cheii de 56 de biti(de de 28 biti)
// spre stanga cu nr biti
var depl:vector28;
i,j,k:byte;
begin
k:=nr;
for i:=1 to length(vect28)-k do
depl[i]:=vect28[i+k];
j:=0;
for i:=length(vect28)-k+1 to length(vect28) do begin
j:=j+1;
depl[i]:=vect28[j];
end;
result:=depl;

167

Anexa (listarea programului)

end; // sfarsitul funciei deplasare_circ_stg


function deplasare_circ_dr(vect28:vector28;nr:byte):vector28;
// functia de deplasare circulara a jumatatii cheii de 56 de biti(de de 28 biti)
// spre dreapta (la decriptare) cu 'nr' biti
var depl:vector28;
i,j,k:byte;
begin
k:=nr;
for i:=1 to length(vect28)-k do
depl[i+k]:=vect28[i];
j:=0;
for i:=length(vect28)-k+1 to length(vect28) do begin
j:=j+1;
depl[j]:=vect28[i];
end;
result:=depl;
end; // sfarsitul funciei deplasare_circ_dr
function trsbin(nr:integer):string;
{ Functia trsbin transforma un nr zecimal
- dat printr-un integer- intr-un nr binar.
Felul rezultatului este explicat mai jos:
Aceasta functie returneaza un string.}
var
i,j:integer;
sw,cat,rest:extended;
v:vector;
begin
i:=0;
sw:=nr;
result:='';
case nr of
0: begin
i:=1;
v[i]:=0;
result:='0';
exit;
end;
1: begin
i:=1;
v[i]:=1;
result:='1';
exit;
end;
else begin
while sw > 1 do begin
cat:=int(sw/2); {aflu citul impartirii la 2}
rest:=sw -(cat*2);
i:=i+1;
v[i]:=int(rest);
sw:=cat;
end;
i:=i+1;
v[i]:=1;
end;

168

Anexa (listarea programului)

for j:=i downto 1 do {scriu vectorul de la coada la cap}


result:=result + floatToStr(v[j]);
end{de la case of}
end; // sfarsitul functiei trsbin - de transformat in binar
function trszec(sir:string):integer;
{ Functia trsnum transforma un nr binar
- dat printr-un stringintr-un nr zecimal. }
var
putere,lung,i,j:integer;
begin
lung:=length(sir);
result:=0;
for i:=1 to lung-1 do
if StrToInt(sir[i])=1 then begin
putere:=1;
for j:=1 to lung-i do
putere:=putere*2;
result:=result+putere;
end;
if StrToInt(sir[lung])=1 then
result:=result+1;
end; // sfarsitul functiei trszec - de transformat in zecimal
function criptare_des(textclar:vector64):vector64;
var i,j,rund,zec1,zec2,zec3,lungi,restu,lin,col,valoare:integer;
jumat1,jumat2,jumat_s,jumat_subst,jumat_dr:vector32;
jumat_exp,jumat_xor:vector48;
cheie_com:vector48;
sirul,sirul1,sirul2:string;
blc1,blc2,blc3,blc4,blc5,blc6,blc7,blc8,blc:vector6;
cutiaS:vector_cutie;
lin_bin:array[1..2] of integer;
col_bin, blc_4b:array[1..4] of integer;
text_c:vector64;
begin
// impart textul de 64 de biti in doua jumatati
for i:=1 to 32 do begin
jumat1[i]:=textclar[i]; // jumatatea din stnga
jumat2[i]:=textclar[i+32]; // jumatatea din dreapta
end; // for
for rund:=1 to 16 do begin // for-ul cu rundele
jumat_s:=jumat2; // jumatatea stanga de la runda "rund+1"
// este jumatatea dreapta din runda "rund"
//si se memoreaza acum pt a putea apela valoarea mai jos
//incep prelucrarea asupra jumatatii DREPTE
//primul lucru: permutarea expandata - se obtine un bloc de 48 de biti
for i:=1 to 48 do
jumat_exp[i]:=jumat2[permexpand[i]];
// s-a obtinut jumat_expandata de 48 de biti

169

Anexa (listarea programului)

//in continuare cheia comprimata este adunata XOR cu blocul expandat


//dar mai intai incarc cheia comprimata care trebuie folosita in "cheie_com"
// !!!! ATENTIE: asta la CRIPTARE; la DECRIPTARE 'keie1' devine 'keie1d',etc
case rund of
1: cheie_com:=keie1;
2: cheie_com:=keie2;
3: cheie_com:=keie3;
4: cheie_com:=keie4;
5: cheie_com:=keie5;
6: cheie_com:=keie6;
7: cheie_com:=keie7;
8: cheie_com:=keie8;
9: cheie_com:=keie9;
10: cheie_com:=keie10;
11: cheie_com:=keie11;
12: cheie_com:=keie12;
13: cheie_com:=keie13;
14: cheie_com:=keie14;
15: cheie_com:=keie15;
16: cheie_com:=keie16;
end; // de case of
// am ales cheia corespunztoare rundei
//pt a face adunarea XOR se transforma mai intai in zecimal
// jumat_exp i cheie_com si se aplica
// functia "xor" rezultand "jumat_xor";
// transform vectorul jumat_exp si cheie_com in string-uri pt a putea
// fi aplicate functiei trszec
for i:=1 to 48 do jumat_xor[i]:=jumat_exp[i] xor cheie_com[i];
// avem vectorul jumat_xor de 48 de biti
// pasul urmator il reprezinta substitutia cu cutii S
// pt aceasta se imparte jumat_xor in 8 blocuri de 6 biti
for i:=1 to 6 do begin
blc1[i]:=jumat_xor[i];
blc2[i]:=jumat_xor[i+6];
blc3[i]:=jumat_xor[i+12];
blc4[i]:=jumat_xor[i+18];
blc5[i]:=jumat_xor[i+24];
blc6[i]:=jumat_xor[i+30];
blc7[i]:=jumat_xor[i+36];
blc8[i]:=jumat_xor[i+42];
end; // de la for
//fac substitutia cu cutiile S dar pt asta trebuie sa selectez blocul "blc"
// si cutiaS corespunzatoare
for i:=1 to 8 do begin // start substitutie
case i of
1: begin
blc:=blc1;
cutiaS:=cutiaS1;
end;
2: begin
blc:=blc2;
cutiaS:=cutiaS2;
end;
3: begin
blc:=blc3;
cutiaS:=cutiaS3;
end;
4: begin

170

Anexa (listarea programului)

blc:=blc4;
cutiaS:=cutiaS4;
end;
5: begin
blc:=blc5;
cutiaS:=cutiaS5;
end;
6: begin
blc:=blc6;
cutiaS:=cutiaS6;
end;
7: begin
blc:=blc7;
cutiaS:=cutiaS7;
end;
8: begin
blc:=blc8;
cutiaS:=cutiaS8;
end;
end; // de la case of
//am terminat de ales blocul si cutia S corespunzatoare
//In continuare determin linia si coloana din cutia S pt blocul nr i
//alegere linie:
lin_bin[1]:=blc[1];
lin_bin[2]:=blc[6];
sirul1:='';
for j:=1 to 2 do sirul1:=sirul1 + IntToStr(lin_bin[j]);
zec1:=trszec(sirul1);
lin:=zec1+1; // am determinat numarul liniei(+1 apare de la faptul ca
// indicii sunt de la 1 la 4 i nu de la 0 la 3)
//alegere coloana
for j:=2 to 5 do col_bin[j-1]:=blc[j];
sirul2:='';
for j:=1 to 4 do sirul2:=sirul2 + IntToStr(col_bin[j]);
zec2:=trszec(sirul2);
col:=zec2+1; // identic ca la linie
// terminat determinare linie si coloana
//iau din cutiaS corespunzatoare, valoarea de la linia si
// coloana determinata
valoare:=cutiaS[lin,col];
//valoarea e transformata in binar
sirul:=trsbin(valoare);
//verific daca blocul obtinut are 4 biti iar daca nu, copletez
lungi:=length(sirul);
case lungi of
1: begin
blc_4b[1]:=0;
blc_4b[2]:=0;
blc_4b[3]:=0;
blc_4b[4]:=StrToInt(sirul[1]);
end;
2: begin
blc_4b[1]:=0;
blc_4b[2]:=0;
blc_4b[3]:=StrToInt(sirul[1]);
blc_4b[4]:=StrToInt(sirul[2]);
end;
3: begin
blc_4b[1]:=0;
blc_4b[2]:=StrToInt(sirul[1]);

171

Anexa (listarea programului)

blc_4b[3]:=StrToInt(sirul[2]);
blc_4b[4]:=StrToInt(sirul[3]);
end;
4: begin
blc_4b[1]:=StrToInt(sirul[1]);
blc_4b[2]:=StrToInt(sirul[2]);
blc_4b[3]:=StrToInt(sirul[3]);
blc_4b[4]:=StrToInt(sirul[4]);
end;
end; // de case of
// blc_4b are sigur 4 biti
//salvez blocurile de 4 biti obtinute prin substitutie in "jumat_subst"
for j:=1 to 4 do jumat_subst[j+4*(i-1)]:=blc_4b[j];
end; // de la for-ul cu start substitutie
// "jumat_subst" are 32 de biti care urmeaza sa fie permutati cu cutie P
// aplic permutarea cu cutie P jumatatii "jumat_subst"
for i:=1 to 32 do jumat_dr[i]:=jumat_subst[perm_p[i]];
// am obtinut jumatatea dreapta permutata, de 32 de biti
// aceasta trebuie adunata modulo 2 (XOR) cu jumatatea stnga
// => Transform vectorul jumat1 si jumat_dr in string-uri pt a putea
// fi aplicate functiei trszec
for i:=1 to 32 do jumat2[i]:=jumat_dr[i] xor jumat1[i];
jumat1:=jumat_s;// jumatatea stanga de la runda "rund+1" este jumatatea
// dreapta din runda "rund", apelata din valoarea memorata "jumat_s"
end; // la for-ul cu rundele
// dupa 16 runde avem: jumat1=L16 - jumatatea stnga a textului de 64 de biti,
//
jumat2=R16 - jumatatea dreapta a textului de 64 de biti;
//se compun cele doua jumatati astfel:
for i:=1 to 32 do begin
result[i]:=jumat2[i];
result[i+32]:=jumat1[i];
end;
//result:=text_c;
// text_cifrat (adica: result)reprezinta R16_L16,care se trimite asa la
//decriptare, unde se pleaca de la R16_L16 si se ajunge la R0_L0
//si se face din nou inversia L0_R0 pt a ajunge la textul clar
end; // sfarsitul functiei criptare_des
function decriptare_des(textclar:vector64):vector64;
var i,j,rund,zec1,zec2,zec3,lungi,restu,lin,col,valoare:integer;
jumat1,jumat2,jumat_s,jumat_subst,jumat_dr:vector32;
jumat_exp,jumat_xor:vector48;
cheie_com:vector48;
sirul,sirul1,sirul2:string;
blc1,blc2,blc3,blc4,blc5,blc6,blc7,blc8,blc:vector6;
cutiaS:vector_cutie;
lin_bin:array[1..2] of integer;
col_bin, blc_4b:array[1..4] of integer;
text_c:vector64;
begin
// impart textul de 64 de biti in doua jumatati
for i:=1 to 32 do begin
jumat1[i]:=textclar[i]; // jumatatea din stnga

172

Anexa (listarea programului)

jumat2[i]:=textclar[i+32]; // jumatatea din dreapta


end; // for
for rund:=1 to 16 do begin // for-ul cu rundele
jumat_s:=jumat2; // jumatatea stanga de la runda "rund+1"
// este jumatatea dreapta din runda "rund"
//si se memoreaza acum pt a putea apela valoarea mai jos
//incep prelucrarea asupra jumatatii DREPTE
//primul lucru: permutarea expandata - se obtine un bloc de 48 de biti
for i:=1 to 48 do
jumat_exp[i]:=jumat2[permexpand[i]];
// s-a obtinut jumat_expandata de 48 de biti
//in continuare cheia comprimata este adunata XOR cu blocul expandat
//dar mai intai incarc cheia comprimata care trebuie folosita in "cheie_com"
// !!!! ATENTIE: asta la CRIPTARE; la DECRIPTARE 'keie1' devine 'keie1d',etc
case rund of
1: cheie_com:=keie1d;
2: cheie_com:=keie2d;
3: cheie_com:=keie3d;
4: cheie_com:=keie4d;
5: cheie_com:=keie5d;
6: cheie_com:=keie6d;
7: cheie_com:=keie7d;
8: cheie_com:=keie8d;
9: cheie_com:=keie9d;
10: cheie_com:=keie10d;
11: cheie_com:=keie11d;
12: cheie_com:=keie12d;
13: cheie_com:=keie13d;
14: cheie_com:=keie14d;
15: cheie_com:=keie15d;
16: cheie_com:=keie16d;
end; // de case of
// am ales cheia corespunztoare rundei
//pt a face adunarea XOR se transforma mai intai in zecimal
// jumat_exp i cheie_com si se aplica
// functia "xor" rezultand "jumat_xor";
// transform vectorul jumat_exp si cheie_com in string-uri pt a putea
// fi aplicate functiei trszec
for i:=1 to 48 do jumat_xor[i]:=jumat_exp[i] xor cheie_com[i];
// avem vectorul jumat_xor de 48 de biti
// pasul urmator il reprezinta substitutia cu cutii S
// pt aceasta se imparte jumat_xor in 8 blocuri de 6 biti
for i:=1 to 6 do begin
blc1[i]:=jumat_xor[i];
blc2[i]:=jumat_xor[i+6];
blc3[i]:=jumat_xor[i+12];
blc4[i]:=jumat_xor[i+18];
blc5[i]:=jumat_xor[i+24];
blc6[i]:=jumat_xor[i+30];
blc7[i]:=jumat_xor[i+36];
blc8[i]:=jumat_xor[i+42];
end; // de la for
//fac substitutia cu cutiile S dar pt asta trebuie sa selectez blocul "blc"
// si cutiaS corespunzatoare
for i:=1 to 8 do begin // start substitutie

173

Anexa (listarea programului)

case i of
1: begin
blc:=blc1;
cutiaS:=cutiaS1;
end;
2: begin
blc:=blc2;
cutiaS:=cutiaS2;
end;
3: begin
blc:=blc3;
cutiaS:=cutiaS3;
end;
4: begin
blc:=blc4;
cutiaS:=cutiaS4;
end;
5: begin
blc:=blc5;
cutiaS:=cutiaS5;
end;
6: begin
blc:=blc6;
cutiaS:=cutiaS6;
end;
7: begin
blc:=blc7;
cutiaS:=cutiaS7;
end;
8: begin
blc:=blc8;
cutiaS:=cutiaS8;
end;
end; // de la case of
//am terminat de ales blocul si cutia S corespunzatoare
//In continuare determin linia si coloana din cutia S pt blocul nr i
//alegere linie:
lin_bin[1]:=blc[1];
lin_bin[2]:=blc[6];
sirul1:='';
for j:=1 to 2 do sirul1:=sirul1 + IntToStr(lin_bin[j]);
zec1:=trszec(sirul1);
lin:=zec1+1; // am determinat numarul liniei(+1 apare de la faptul ca
// indicii sunt de la 1 la 4 i nu de la 0 la 3)
//alegere coloana
for j:=2 to 5 do col_bin[j-1]:=blc[j];
sirul2:='';
for j:=1 to 4 do sirul2:=sirul2 + IntToStr(col_bin[j]);
zec2:=trszec(sirul2);
col:=zec2+1; // identic ca la linie
// terminat determinare linie si coloana
//iau din cutiaS corespunzatoare, valoarea de la linia si
// coloana determinata
valoare:=cutiaS[lin,col];
//valoarea e transformata in binar
sirul:=trsbin(valoare);
//verific daca blocul obtinut are 4 biti iar daca nu, copletez
lungi:=length(sirul);
case lungi of
1: begin

174

Anexa (listarea programului)

blc_4b[1]:=0;
blc_4b[2]:=0;
blc_4b[3]:=0;
blc_4b[4]:=StrToInt(sirul[1]);
end;
2: begin
blc_4b[1]:=0;
blc_4b[2]:=0;
blc_4b[3]:=StrToInt(sirul[1]);
blc_4b[4]:=StrToInt(sirul[2]);
end;
3: begin
blc_4b[1]:=0;
blc_4b[2]:=StrToInt(sirul[1]);
blc_4b[3]:=StrToInt(sirul[2]);
blc_4b[4]:=StrToInt(sirul[3]);
end;
4: begin
blc_4b[1]:=StrToInt(sirul[1]);
blc_4b[2]:=StrToInt(sirul[2]);
blc_4b[3]:=StrToInt(sirul[3]);
blc_4b[4]:=StrToInt(sirul[4]);
end;
end; // de case of
// blc_4b are sigur 4 biti
//salvez blocurile de 4 biti obtinute prin substitutie in "jumat_subst"
for j:=1 to 4 do jumat_subst[j+4*(i-1)]:=blc_4b[j];
end; // de la for-ul cu start substitutie
// "jumat_subst" are 32 de biti care urmeaza sa fie permutati cu cutie P
// aplic permutarea cu cutie P jumatatii "jumat_subst"
for i:=1 to 32 do jumat_dr[i]:=jumat_subst[perm_p[i]];
// am obtinut jumatatea dreapta permutata, de 32 de biti
// aceasta trebuie adunata modulo 2 (XOR) cu jumatatea stnga
// => Transform vectorul jumat1 si jumat_dr in string-uri pt a putea
// fi aplicate functiei trszec
for i:=1 to 32 do jumat2[i]:=jumat_dr[i] xor jumat1[i];
jumat1:=jumat_s;// jumatatea stanga de la runda "rund+1" este jumatatea
// dreapta din runda "rund", apelata din valoarea memorata "jumat_s"
end; // la for-ul cu rundele
// dupa 16 runde avem: jumat1=L16 - jumatatea stnga a textului de 64 de biti,
//
jumat2=R16 - jumatatea dreapta a textului de 64 de biti;
//se compun cele doua jumatati astfel:
for i:=1 to 32 do begin
result[i]:=jumat2[i];
result[i+32]:=jumat1[i];
end;
//result:=text_c;
// text_cifrat (adica: result)reprezinta R16_L16,care se trimite asa la
//decriptare, unde se pleaca de la R16_L16 si se ajunge la R0_L0
//si se face din nou inversia L0_R0 pt a ajunge la textul clar
end; // sfarsitul functiei decriptare_des

end.

175

S-ar putea să vă placă și