Проведение анализа существующих систем защиты компьютерных систем

Обзор технологий обнаружения атак. Модуль накопления и хранения предупреждений. Алгоритм работы подсистемы. Реализация клиент-серверной технологии. Клиентская часть программы. Реализация модуля шифрования, модуля накопления и хранения предупреждений.

Рубрика Программирование, компьютеры и кибернетика
Вид дипломная работа
Язык русский
Дата добавления 17.11.2014
Размер файла 582,6 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Представленная архитектура несовершенна, но она позволяет обеспечить защиту информационной системы с большой вероятностью отражения обнаруженной атаки, не мешая работоспособности как всей сети в целом, так и рабочих станций с установленными клиентскими приложениями.

В результате выполнения данной дипломной работы получены следующие результаты:

- изучены и проанализированы существующие системы обнаружения атак, применяемые в них технологии;

- сформированы требования к подсистеме защищенной передачи данных клиента серверу;

- разработан алгоритм работы подсистемы и отдельных модулей;

- осуществлена программная реализация разработанной подсистемы;

- произведены тесты программного продукта.

В ходе выполнения дипломной работы поставленные цели и задачи выполнены, получен опыт разработки алгоритмов и программного продукта.

СПИСОК ИСПОЛЬЗУЕМЫХ ИСТОЧНИКОВ

1 CERT/CC Statistics 1995-2008 - http://www.cert.org/stats/

2 Кудин Д.В., Корольков В.В. Некоторые подходы к моделированию атак в информационных системах. - http://www.bezpeka.com/library/sci/arc/kudin_article4.zip

3 Костров Д.В. Рынок систем обнаружения компьютерных атак.-Конфидент, №6, 2002 г.

4 Лукацкий А.В. Обнаружение атак в новом тысячелетии.- http://www.infosec.ru//press/pub_luka.html

5 Лукацкий А.В. Системы обнаружения атак.- http://www.infosec.ru/press/pdf/p118.pdf

6 Кеммерер Р., Виджна Дж. Обнаружение вторжений: краткая история и обзор.- "Открытые системы", №07-08, 2002г.

7 Лукацкий А.В. Новые грани обнаружения и отражения угроз. - http://www.citforum.ru/internet/securities/grani.shtml

8 TCPWrapper http://coast.cs.purdue.edu/pub/tools/unix

9 NukeNabber http://onlyhakers.clan.su/load/programmy/khakeru/nuke_nabber_2_9/14-1-0-18

10 AtGuard http://www.atguard.com/

11 Internet Security Systems RealSecure 3.0, Internet Scanner http://www.iss.net

12 CyberCafe http://www.cybercafe.com/

13 Tripwire Security Systems Tripwire for Unix, Windows NT http://www.tripwiresecurity.com

14 An Evaluation of Network Intrusion Detection Systems, NFR Security Inc., www.nfr.com

15 Intrusion Detection: Systems and Models, Joseph S. Sherif, California State University, Fullerton, Tommy G. Dearmond, California Institute of Technology

16 Лукацкий А.В. Так ли надежны традиционные механизмы защиты? - http://www.bezpeka.com/library/adm/arc/lukactradic.zip

17 Обнаружение атак - сетевой или системный уровень? - http://www.citforum.ru/internet/securities/netsys.shtml

18 Лукацкий А.В. Обнаружение атак своими силами. - http://bre.ru/security/17097.html

19 Intrusion detection FAQ Версия 0.95/ Пер. А.В.Лукацкого.- http://www.infosec.ru/press/pub_luka.html

20 Шамис В. Borland C++ Builder 6: учебный курс. - СПб.: Питер, 2002. - 688 с.

ПРИЛОЖЕНИЕ А

Листинг программы

Данное приложение представляет собой исходный программный код серверной части транспортной подсистемы обнаружения атак.

#include <vcl.h>

#pragma hdrstop

USERES("NetServer.res");

USEFORM("Server.cpp", Form1);

USEFORM("form.cpp", Event);

USEFORM("aboutNS.cpp", AboutBox);

USEFORM("PROj.cpp", RSA);

WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)

{ try { Application->Initialize();

Application->CreateForm(__classid(TForm1), &Form1);

Application->CreateForm(__classid(TEvent), &Event);

Application->CreateForm(__classid(TAboutBox), &AboutBox);

Application->CreateForm(__classid(TRSA), &RSA);

Application->Run(); }

catch (Exception &exception)

{ Application->ShowException(&exception); }

return 0; }

#include <vcl.h> #include <conio.h> #include <stdio.h> #include <stdlib.h>

#include <string.h> #include <math.h> #pragma hdrstop #include "PROj.h"

#pragma package(smart_init) #pragma resource "*.dfm"

TRSA *RSA;

const MaxDig = 1000,//максимальное количество четырехзначных цифр

Osn = 10000;//основание системы счисления,

//typedef struct{int Tlg[1000];int znak;} Tlong;

Tlong p,q,nn,fi,e,d,M,C; int count; int L;

//-----------процедура считывания длинного числа из файла name----------

Tlong TRSA::ReadLong(char *name)

{ FILE *rl;

Tlong a; char ch; int h;

for(int i=0;i<MaxDig;i++)

{ a.Tlg[i]=0; //обнуление элементов массива }

a.znak=0; //знак длинного числа: 0-положительное; 1-отрицательное

rl=fopen(name,"r");

ch=getc(rl);

while(ch!='\n')

{ for(int i=a.Tlg[0];i>=1;i--)

{//протаскивание старшей цифры в числе из A[i]в младшую цифру числа из A[i+1]

a.Tlg[i+1]=a.Tlg[i+1]+((long int)a.Tlg[i]*10)/Osn;

a.Tlg[i]=((long int)a.Tlg[i]*10)%Osn; }

//добавляем младшую цифру к числу из А[1]

a.Tlg[1]=a.Tlg[1]+(long int)ch-(long int)'0';

//изменяем число задействованных элементов

if(a.Tlg[a.Tlg[0]+1]>0) a.Tlg[0]++;

ch=getc(rl); } fclose(rl); return a;}

//---------------------вывод длинного числа в файл--------------------------

void TRSA::WriteLong(Tlong a,char *name)

{ char *s, *tmp[3]={"000","00","0"};

String STR; int num, sd; sd=Osn/10; FILE *fl; STR=IntToStr(sd); fl=fopen(name,"w"); fprintf(fl,"%d",a.Tlg[a.Tlg[0]]);

for(int i=a.Tlg[0]-1;i>=1;i--)

{ STR=IntToStr(a.Tlg[i]);

s=STR.c_str(); if((4-strlen(s))==3)

{ fputs(tmp[0],fl); fputs(s,fl); }

if((4-strlen(s))==2) { fputs(tmp[1],fl); fputs(s,fl); }

if((4-strlen(s))==1)

{ fputs(tmp[2],fl); fputs(s,fl); }

if((4-strlen(s))==0) fputs(s,fl); } fputs("\r\n",fl); fclose(fl);}

Tlong TRSA::GenSimple(int dlina)

{ const int dl_reg=34;//dlina registra

int reg[dl_reg];//registr

int n, m, t, tmp, priznak; int chisla[512];

int

Tlong x,y,z,ad,x_1;//x - testiryemoe dlinnoe chislo

n=dlina; m=13; // y - vce po porydku iz Mas_Simple; z=x mod y

randomize(); priznak=0;

while(priznak!=1) // ecli priznak=1 - prostoe chislo naydeno

{ for(int u=0;u<dl_reg;u++) reg[u]=random(2);//nachalnoe zapolnenie registra

//---------------generacia bit dlinnogo chusla-----------------------------

for(int u=0;u<n;u++)

{ tmp=reg[33]^reg[32]^reg[29]^reg[28]^reg[27]^reg[0];

chisla[u]=reg[dl_reg-1]; or (int qw=dl_reg-1;qw>0;qw--) reg[qw]=reg[qw-1]; reg[0]=tmp;}

for(int u=0;u<MaxDig;u++) x.Tlg[u]=0;//obnylenie

for(int u=0;u<MaxDig;u++) y.Tlg[u]=0;// t=0;

chisla[0]=1; chisla[n-1]=1;//

for(int u=0;u<m;u++) t+=chisla[n-1-u]*pow(2,u);//znachenie mladshix 13 bit

x.Tlg[0]=1; x.Tlg[1]=t;//nachalnoe znachenie dlinnogo chisla

y.Tlg[0]=1; y.Tlg[1]=8192;//vspomogatelnyi massiv dlya perevoda bin->dec

for(int u=m;u<n;u++)

{// perevod bin->dec; formirovanie dlinnogo chisla

if(chisla[n-1-u]==1) x=SumLongTwo(x,y); y=SMul(y,2); }

for(int u=0;u<MaxDig;u++) y.Tlg[u]=0; y.Tlg[0]=1;

//-----------------------------test Rabina Millera--------------------------

if (priznak==1)

{ chisla[n-1]=0; v binary form x_1=x; x_1.Tlg[1]--; v dec forme y.Tlg[1]=1;

//proverka chisla x; berem neckolko(iter) znacheni ad

for(int iter=0;iter<10;iter++)

{ for( int u=0;u<MaxDig;u++) ad.Tlg[u]=0;//--

int kol=random(18)+1;//--

ad.Tlg[0]=kol;//-- generacia clychainogo chisla a dlya testa R-M

for(int u=1;u<=kol;u++) ad.Tlg[u]=random(10000);//--

for(int u=0;u<MaxDig;u++) z.Tlg[u]=0;

for(int u=0;u<n;u++) { z=y; y=Mul_Long(y,y); y=Long_Mod_Long(y,x);

if( (y.Tlg[0]==1) && (y.Tlg[1]==1) && (z.Tlg[1]!=1) && (More(z,x_1,0)!=2) )

{ priznak=0; break; }

if(chisla[u]==1) { y=Mul_Long(y,ad); y=Long_Mod_Long(y,x); } } if( (y.Tlg[0]==1) && (y.Tlg[1]==1) && (priznak==1) ) priznak=1;

else { priznak=0; break; } } } }

return x;}

//-----------------------------GenOpenKey---E--------------------------------

Tlong TRSA::GenOpenKey(int dlina_e)

{ Tlong proE;

for(int i=0;i<MaxDig;i++) proE.Tlg[i]=0;

proE.Tlg[0]=dlina_e;

for(int i=1;i<=dlina_e;i++) proE.Tlg[i]=random(10000);

return proE;}

//---------------------------GenSecretKey---D--------------------------------

Tlong TRSA::GenSecretKey(Tlong e1, Tlong fi1)

{ Tlong proD,x1,x2,x3,y1,y2,y3,Q,t1,t2,t3;

for(int kl=0;kl<MaxDig;kl++)

{ x1.Tlg[kl]=0; x2.Tlg[kl]=0; x3.Tlg[kl]=0;

y1.Tlg[kl]=0; y2.Tlg[kl]=0; y3.Tlg[kl]=0;

t1.Tlg[kl]=0; t2.Tlg[kl]=0; t3.Tlg[kl]=0;

proD.Tlg[kl]=0; Q.Tlg[kl]=0; }

x1.znak=0; x2.znak=0; x3.znak=0;

y1.znak=0; y2.znak=0; y3.znak=0;

t1.znak=0; t2.znak=0; t3.znak=0;

proD.znak=0; Q.znak=0;

x1.Tlg[0]=1; x1.Tlg[1]=1;

y2.Tlg[0]=1; y2.Tlg[1]=1;

x3=fi1; y3=e1;

while (y3.znak==0)

{ if (y3.Tlg[1]==0) break;

if( (y3.Tlg[0]==1) && (y3.Tlg[1]==1) ) {proD=y2; break;}

Q=Long_Div_Long(x3,y3);

if ( (x3.znak==0) && (y3.znak==0) ) Q.znak=0;

if ( (x3.znak==1) && (y3.znak==1) ) Q.znak=0;

if ( ((x3.znak==1) && (y3.znak==0)) || ((x3.znak==0) && (y3.znak==1)) ) Q.znak=1;

t1=Sub_Znak(x1,Q,y1);

t2=Sub_Znak(x2,Q,y2);

t3=Sub_Znak(x3,Q,y3);

x1=y1; x2=y2; x3=y3;

y1=t1; y2=t2; y3=t3; }

if(proD.znak==1) proD=Sub(fi1,proD,0);

return proD; }

//--------------------Vozvedenie v stepen po modyly--------------------------

Tlong TRSA::Crypt(Tlong Osnov, Tlong Stepen, Tlong Modul)

{ int count;

Tlong DVA, BinBit, Ostatok;

int Mas_Bin[512]; int BUFF; for(int r=0;r<MaxDig;r++)

{ DVA.Tlg[r]=0; Ostatok.Tlg[r]=0; BinBit.Tlg[r]=0; }

//predstavlenie stepeni v binary form - massiv Mas_Bin

DVA.Tlg[0]=1; DVA.Tlg[1]=2; count=0;

while ( Stepen.Tlg[1]!=1 || Stepen.Tlg[0]!=1 )

{ BinBit=Long_Mod_Long(Stepen,DVA); Mas_Bin[count]=BinBit.Tlg[1];

Stepen=Long_Div_Long(Stepen,DVA); count++; }

Mas_Bin[count]=Stepen.Tlg[1]; for(int r=0;r<((count+1)/2);r++)

{ BUFF=Mas_Bin[r]; Mas_Bin[r]=Mas_Bin[count-r]; Mas_Bin[count-r]=BUFF; }

//------------------vozvedenie v stepen po modyly----------------------------

Ostatok.Tlg[0]=1; Ostatok.Tlg[1]=1;

for(int r=0;r<=count;r++)

{ Ostatok=Mul_Long(Ostatok,Ostatok);

Ostatok=Long_Mod_Long(Ostatok,Modul); if(Mas_Bin[r]==1)

{ Ostatok=Mul_Long(Ostatok,Osnov);

Ostatok=Long_Mod_Long(Ostatok,Modul); } }

return Ostatok;}

void TRSA::Symb2Num(String name)

{ TFileStream *psw =new TFileStream(name,fmOpenRead);

int size=psw->Size; byte *parol=new byte[size];

int ch[32]; for(int i=0;i<32;i++) ch[i]=0;

AnsiString Str; psw->Read(parol,size); for(int i=0;i<size;i++)

{ ch[i]=(int)(*(parol+i))+100; Str=Str+ch[i]; }

Str=Str+"\r\n"; delete psw;

TFileStream *psd=new TFileStream(name,fmCreate);

psd->Write(Str.c_str(),size*3+2); delete psw;}

void TRSA::Num2Symb(String name)

{ TFileStream *psw =new TFileStream(name,fmOpenRead);

int size=psw->Size; String Str1; char parol[3];

int ch[32]; for(int i=0;i<32;i++) ch[i]=0; for(int i=0;i<((size-2)/3);i++)

{ psw->Read((void*)parol,3);

for(int v=0;v<3;v++)

Str1=Str1+parol[v]; ch[i]=Str1.ToInt()-100; Str1=""; }

delete psw; for(int i=0;i<((size-2)/3);i++)

Str1=Str1+(char)ch[i];

TFileStream *psd=new TFileStream(name,fmCreate);

psd->Write(Str1.c_str(),(size-2)/3); delete psd;}

__fastcall TRSA::TRSA(TComponent* Owner)

: TForm(Owner)

{/* p=Form1->GenSimple(256);//prostoe (...) bitnoe chislo

q=Form1->GenSimple(256);//prostoe (...) bitnoe chislo

nn=Form1->Mul_Long(p,q);//nn=p*q

p.Tlg[1]--; q.Tlg[1]--;

fi=Form1->Mul_Long(p,q);//fi=(p-1)*(q-1)

for(L=0;L<MaxDig;L++) e.Tlg[L]=0;

// e.Tlg[0]=2; e.Tlg[1]=5537; e.Tlg[2]=6;//berem open key = 65537 from X.509

// d=Form1->GenSecretKey(e,fi);//poisk secret key - Algoritm Euklida

//ecli multiplikativnogo obratnogo k chisly 65537 net, to vibiraem cami

while(d.Tlg[0]==0) {

e=Form1->GenOpenKey(18);//256-18, 32-2

d=Form1->GenSecretKey(e,fi); //Extended Euklid }*/

/*e=Form1->ReadLong("server.ok");

d=Form1->ReadLong("server.pk");

nn=Form1->ReadLong("modul.ok");

Form1->Symb2Num("parol.txt");

M=Form1->ReadLong("parol.txt");

C=Form1->Crypt(M,e,nn);//C=M^e mod n

M=Form1->Crypt(C,d,nn);//M=C^d mod n

Form1->WriteLong(M,"out.txt");

//Form1->WriteLong(d,"server.pk");

//Form1->WriteLong(nn,"modul.ok");

//Form1->Symb2Num("parol.txt");

//Form1->Num2Symb("parol.txt"); */ }

#include <vcl.h> #include <stdio.h> #include <conio.h> #include <io.h>

#include <fcntl.h> #pragma hdrstop

#include "form.h" #pragma package(smart_init)

#pragma resource "*.dfm"

TEvent *Event;

unsigned long int X[8],GX[8];

unsigned long int N[2]; //64-

unsigned long int Sync[2],GSync[2]; //

int inHandle; int outHandle; int Err=0;int gen, gensync;

void TEvent::GetSync(String name)

{ TFileStream* sk = new TFileStream(name+".syn",fmOpenRead);

byte* _tm; _tm = new byte[4]; for(int f=0;f<2;f++)

{ sk->ReadBuffer(&_tm,4); Sync[f]=(unsigned long int)_tm; }

delete sk;}

void TEvent::GetKey(String name)

{ TFileStream* sk = new TFileStream(name+".key",fmOpenRead);

byte* _tm; _tm = new byte[4]; for(int f=0;f<8;f++)

{ sk->ReadBuffer(&_tm,4); X[f]=(unsigned long int)_tm; }

delete sk;}

unsigned long int TEvent::s2s(int d)

{ int q,j; q=2; if(d==0) return 1; j=s2s(d-1)*q; return j;}

void TEvent::GenerKey()

{ unsigned long int _tmp; byte* _tm; randomize(); _tm = new byte[4];

TFileStream *sk =new TFileStream("server.key",fmCreate);

for(int f=0;f<8;f++)

{ for(int o=0;o<32;o++)

{ gen=random(2);

X[f]=X[f]+gen*s2s(o); }

_tm=(byte*)X[f]; sk->WriteBuffer(&_tm,4); sk->Position=sk->Size; }

delete sk;}

void TEvent::GenerSync()

{ unsigned long int _tmp;

byte* _tm; _tm = new byte[4];

TFileStream *sk =new TFileStream("server.syn",fmCreate);

for(int f=0;f<2;f++)

{ for(int o=0;o<32;o++)

{ gensync=random(2); Sync[f]=Sync[f]+gensync*s2s(o); }

_tm=(byte*)Sync[f]; sk->WriteBuffer(&_tm,4); sk->Position=sk->Size; }

delete sk;}

unsigned long int TEvent::shift_l(unsigned long int var)

{ unsigned long int tmp; tmp=var; var=var & 0x80000000;

var=var>>31; tmp=tmp<<1; var=var+tmp; return var;}

void TEvent::Base_step(unsigned long int *N,unsigned long int key)

{ struct b_32 {

unsigned int b1:4;

unsigned int b2:4;

unsigned int b3:4;

unsigned int b4:4;

unsigned int b5:4;

unsigned int b6:4;

unsigned int b7:4;

unsigned int b8:4; };

union bit32{ unsigned long int S; struct b_32 S_4b; } SS;

SS.S=N[0] + key;

SS.S_4b.b1 = H[SS.S_4b.b1][0].b4;

SS.S_4b.b2 = H[SS.S_4b.b2][1].b4;

SS.S_4b.b3 = H[SS.S_4b.b3][2].b4;

SS.S_4b.b4 = H[SS.S_4b.b4][3].b4;

SS.S_4b.b5 = H[SS.S_4b.b5][4].b4;

SS.S_4b.b6 = H[SS.S_4b.b6][5].b4;

SS.S_4b.b7 = H[SS.S_4b.b7][6].b4;

SS.S_4b.b8 = H[SS.S_4b.b8][7].b4;

for (int i=0;i<11;i++) SS.S=shift_l(SS.S);

SS.S=SS.S ^ N[1];

N[1]=N[0]; N[0]=SS.S; };

void TEvent::Crypt(unsigned long int *N)

{ for (int k=0;k<3;k++) { for (int j=0;j<8;j++) Base_step(N,X[j]); }

for (int i=7;i>=0;i--) Base_step(N,X[i]); unsigned long int tmp;

tmp=N[0]; N[0]=N[1]; N[1]=tmp;

}//end Crypt

void TEvent::ProcessCrypt(char* flname,bool Decrypt)

{ if ((inHandle = open(flname, O_BINARY | O_RDONLY)) == -1)

{ Err++; }

if ((outHandle = open("file02.tmp", O_BINARY|O_TRUNC|O_WRONLY)) == -1) { Err++; } if (Err==0) { int inSize;

while((inSize = read(inHandle, N, 8)) != 0)

{ Crypt(Sync); Sync[0]=N[0] ^ Sync[0]; Sync[1]=N[1] ^ Sync[1];

write(outHandle, Sync, inSize); if (Decrypt==true) { Sync[0]=N[0]; Sync[1]=N[1];}}

close(inHandle); close(outHandle); } }

void TEvent::Decrypt(String dname)

{ Event->ProcessCrypt(dname.c_str(),true);

DeleteFile(dname);

TFileStream *dec =new TFileStream(dname,fmCreate);

TFileStream *dc =new TFileStream("file02.tmp",fmOpenRead);

dec->CopyFrom(dc,dc->Size);

delete dec; delete dc;}

__fastcall TEvent::TEvent(TComponent* Owner)

: TForm(Owner){ }

#include <vcl.h> #include <dir.h> #include <cstring.h> #pragma hdrstop

#include "form.h" #include "Server.h" #include "aboutNS.h" #include "PROj.h"

#pragma package(smart_init) #pragma resource "*.dfm"

TForm1 *Form1;

int c,k,i,j,counter,cnt1,nm; int v,g;

//Номер идентифицированного клиента в таблице всех пользователей

int TN; AnsiString s1, str; String FileN, GetIP;

//Структура для передачи/приёма файла

struct filesend{ String ip; //ip-адрес

String name; //имя файла

String size; //размер файла

}snd,recieve;

//массив активных ip-адресов

String ipadr[29];

//массив ip-адров для проверки на отсоединение

String old_ipadr[29]; byte *tmp2,*tmps; TFileStream *fs,*fss;

//Файловый поток для событий

TFileStream* f = new TFileStream("events.txt",fmOpenReadWrite);

//Аутентификация клиента

void TForm1::Autentification(String ipad, int n)

{ Tlong e,d,p,n1;

String nnn=ipad+"\\"+ipad+".psw";

p=RSA->ReadLong(nnn.c_str());

d=RSA->ReadLong("server.pk");

n1=RSA->ReadLong("server.mod");

p=RSA->Crypt(p,d,n1);

RSA->WriteLong(p,nnn.c_str());

RSA->Num2Symb(nnn);

String pwd; char pas[16];

TFileStream *psw=new TFileStream(ipad+"\\"+ipad+".psw",fmOpenRead);

psw->Read((void*)pas,16);

for(i=0;i<16;i++) pwd=pwd+pas[i]; delete psw;

if(pwd==AllUsers->Cells[1][n])

{ ListBox1->Items->Add(DateToStr(Date())+" "+TimeToStr(Time())+" "+"Client "+Form1->AllUsers->Cells[0][n]+" autentified");

TFileStream *nk=new TFileStream("server.~key",fmCreate);

TFileStream *nk2=new TFileStream("server.key",fmOpenRead);

nk->CopyFrom(nk2,nk2->Size);

delete nk2; RSA->Symb2Num("server.key");

p=RSA->ReadLong("server.key");

e=RSA->ReadLong("client1.ok");

n1=RSA->ReadLong("client1.mod");

p=RSA->Crypt(p,e,n1);

RSA->WriteLong(p,"server.key");

FileSending("server.key",GetIP);

TFileStream *nk3=new TFileStream("server.key",fmCreate);

nk->Position=0; nk3->CopyFrom(nk,nk->Size);

delete nk; delete nk3; }

else { ListBox1->Items->Add(DateToStr(Date())+" "+TimeToStr(Time())+" "+"Client didn't autentified");

for(int d=0; d<=(ServerSocket1->Socket->ActiveConnections-1);d++)

if(ipad==ServerSocket1->Socket->Connections[d]->RemoteAddress)

{ ServerSocket1->Socket->Connections[d]->Close(); break; } }

DeleteFile(ipad+"\\"+ipad+".psw");}

//Отправка файла

void TForm1::FileSending(String name,String ipad)

{ int nomer,x; static int st; if(st>=1) { delete tmps; }

fss = new TFileStream(name,fmOpenRead);

tmps= new byte[fss->Size];

fss->Read(tmps,fss->Size);

//для приёма файла клиентом

snd.ip=ipad; snd.name=name; snd.size=(String)fss->Size;

for(x=0;x<=(ServerSocket1->Socket->ActiveConnections-1);x++)

{ if(snd.ip==ServerSocket1->Socket->Connections[x]->RemoteAddress) nomer=x; }

ServerSocket1->Socket->Connections[nomer]->SendText(snd.ip+"//"+snd.name+"///"+snd.size);

Sleep(1000);

ServerSocket1->Socket->Connections[nomer]->SendBuf(tmps,snd.size.ToInt());

st++; v++;

Label3->Caption=(String)v; if(v>=2) {

SendTable->RowCount=v+1;

SendTable->Cells[0][v]=snd.name;

SendTable->Cells[1][v]=snd.ip; }

else { SendTable->Cells[0][1]=snd.name;

SendTable->Cells[1][1]=snd.ip; }

delete fss;

ListBox1->Items->Add(DateToStr(Date())+" "+TimeToStr(Time())+" "+"File "+"'"+name+"'"+" sended to "+snd.ip);}

//Сохранение файла

void TForm1::SavingFile(TFileStream* fs, String FileName)

{ int dir; String com;

dir=mkdir(recieve.ip.c_str());

if(!dir) {};

TFileStream* save = new TFileStream(recieve.ip+"\\"+FileName,fmCreate);

save->CopyFrom(fs,fs->Size);

ListBox1->Items->Add(DateToStr(Date())+" "+TimeToStr(Time())+" "+"File '"+FileName+"' recieved from client: "+recieve.ip);

g++; Label4->Caption=(String)g; if(g>=2)

{ GetTable->RowCount=g+1;

GetTable->Cells[0][g]=recieve.name;

GetTable->Cells[1][g]=recieve.ip; }

else

{ GetTable->Cells[0][1]=recieve.name;

GetTable->Cells[1][1]=recieve.ip; }

delete save;

delete fs;}

//Получение имени файла

String TForm1::NameOfFile(AnsiString FileName)

{ int m;

FileN= FileName.c_str();

m=FileN.LastDelimiter("\\");

FileN.Delete(1,m);

return FileN;}

//Проверка клиентов

void TForm1::ActivatedUsers()

{ SendMenu->Items->Clear();

//Проверяем число активных клиентов и обновляем таблицу k=1;

for(i=1;i<=Form1->ServerSocket1->Socket->ActiveConnections;i++)

{ if(Form1->AllUsers->Cells[0][i]==Form1->ServerSocket1->Socket->Connections[i-1]->RemoteAddress)

{ Form1->ActiveUsers->Rows[k]=Form1->AllUsers->Rows[i];

SendMenu->Items->Add(Form1->ActiveUsers->Cells[0][k]);

ipadr[k-1]=ActiveUsers->Cells[0][k];

k++; } }

//проверка на отсоединение

for(i=0;i<29;i++)

{ if(ipadr[i]!=old_ipadr[i])

if(old_ipadr[i]!="")

{ ListBox1->Items->Add(DateToStr(Date())+" "+TimeToStr(Time())+" "+"Client "+old_ipadr[i]+" disconnected");

break; } }

//заполняем массив старых ip-адресов

for(i=0;i<29;i++)

{ old_ipadr[i]=""; old_ipadr[i]=ipadr[i]; }}

__fastcall TForm1::TForm1(TComponent* Owner)

: TForm(Owner)

{ //Заполняем заголовки таблиц

AllUsers->Cells[0][0]="IP-address";

AllUsers->Cells[1][0]="Пароль";

AllUsers->Cells[2][0]="Филиал";

AllUsers->Cells[3][0]="Оператор";

AllUsers->Cells[4][0]="Откр. ключ";

ActiveUsers->Cells[0][0]="IP-address";

ActiveUsers->Cells[1][0]="Пароль";

ActiveUsers->Cells[2][0]="Филиал";

ActiveUsers->Cells[3][0]="Оператор";

ActiveUsers->Cells[4][0]="Откр. ключ";

GetTable->Cells[0][0]="Файл";

GetTable->Cells[1][0]="От клиента";

SendTable->Cells[0][0]="Файл";

SendTable->Cells[1][0]="Клиенту";

Event->GenerKey();

Time1->Caption=DateToStr(Date())+" "+TimeToStr(Time());

Event->GenerSync();

Time2->Caption=DateToStr(Date())+" "+TimeToStr(Time());}

void __fastcall TForm1::Button1Click(TObject *Sender)

{ //Запуск сервера

Button1->Enabled = false;

N2->Enabled=false;

N3->Enabled=true;

Button2->Enabled = true;

ServerSocket1->Port = Edit1->Text.ToInt();

ListBox1->Items->Add(DateToStr(Date())+" "+TimeToStr(Time())+" "+"Server starting");

c=ServerSocket1->Socket->ActiveConnections;

Label2->Caption=(AnsiString)c;

ServerSocket1->Open();}

void __fastcall TForm1::Button2Click(TObject *Sender)

{ //Остановка сервера

Button1->Enabled = true;

N2->Enabled=true; N3->Enabled=false; Button2->Enabled = false;

ServerSocket1->Active = false;

ListBox1->Items->Add(DateToStr(Date())+" "+TimeToStr(Time())+" "+"Server stopped");

Label2->Caption="0";}

void __fastcall TForm1::ServerSocket1Listen(TObject *Sender,

TCustomWinSocket *Socket)

{ ListBox1->Items->Add(DateToStr(Date())+" "+TimeToStr(Time())+" "+"Listening on port "+IntToStr(ServerSocket1->Port));}

void __fastcall TForm1::ServerSocket1Accept(TObject *Sender,

TCustomWinSocket *Socket)

{ ListBox1->Items->Add(DateToStr(Date())+" "+TimeToStr(Time())+" "+"Client connection accepted");}

void __fastcall TForm1::ServerSocket1ClientConnect(TObject *Sender,

TCustomWinSocket *Socket)

{ int cc;

ListBox1->Items->Add(DateToStr(Date())+" "+TimeToStr(Time())+" "+"Client connected");

Label2->Caption=(AnsiString)(ServerSocket1->Socket->ActiveConnections);

cc=1; for(i=0;i<Label1->Caption.ToInt();i++)

if(Form1->AllUsers->Cells[0][i+1]==ServerSocket1->Socket->Connections[ServerSocket1->Socket->ActiveConnections-1]->RemoteAddress)

{ ListBox1->Items->Add(DateToStr(Date())+" "+TimeToStr(Time())+" "+"Client "+Form1->AllUsers->Cells[0][i+1]+" identified");

TN=i+1; GetIP=ServerSocket1->Socket->Connections[ServerSocket1->Socket->ActiveConnections-1]->RemoteAddress;

break; } else

{ if(Label1->Caption.ToInt()==cc)

{ ServerSocket1->Socket->Connections[ServerSocket1->Socket->ActiveConnections-1]->Close();

ListBox1->Items->Add(DateToStr(Date())+" "+TimeToStr(Time())+" "+"Client not identified"); }

cc++; }

Form1->ActivatedUsers();}

void __fastcall TForm1::ServerSocket1ClientDisconnect(TObject *Sender,

TCustomWinSocket *Socket)

{ //ListBox1->Items->Add(DateToStr(Date())+" "+TimeToStr(Time())+" "+"Client disconnected");

c=ServerSocket1->Socket->ActiveConnections;

Label2->Caption=(AnsiString)(c-1);

SendMenu->Text="";}

void __fastcall TForm1::ServerSocket1ClientError(TObject *Sender,

TCustomWinSocket *Socket, TErrorEvent ErrorEvent, int &ErrorCode)

{ ListBox1->Items->Add(DateToStr(Date())+" "+TimeToStr(Time())+" "+"Client error. Code = "+IntToStr(ErrorCode));}

void __fastcall TForm1::ServerSocket1ClientWrite(TObject *Sender,

TCustomWinSocket *Socket)

{ ListBox1->Items->Add(DateToStr(Date())+" "+TimeToStr(Time())+" "+"Now can write to socket");}

void __fastcall TForm1::ServerSocket1ClientRead(TObject *Sender,

TCustomWinSocket *Socket)

{ int m,g; byte *buf; TFileStream* tmp3; if(cnt1==0)

{ str=Socket->ReceiveText();

recieve.ip=str.SubString(1,str.AnsiPos("//")-1);

str=str.SubString(str.AnsiPos("//")+2,str.Length());

recieve.name=str.SubString(1,str.AnsiPos("///")-1);

recieve.size=str.SubString(str.AnsiPos("///")+3,str.Length());

cnt1++;

for(g=0;g<=(ServerSocket1->Socket->ActiveConnections-1);g++)

{ if(recieve.ip==ServerSocket1->Socket->Connections[g]->RemoteAddress) nm=g; } } if(cnt1>=1)

{ //Записываем в l размер полученного блока

m=ServerSocket1->Socket->Connections[nm]->ReceiveLength();

//Занимаем память для буфера

buf=new byte[m+1];

//Записываем в буфер полученный блок

ServerSocket1->Socket->Connections[nm]->ReceiveBuf(buf,m);

//Открываем временный файл для записи

tmp3=new TFileStream("file03.tmp",fmOpenReadWrite);

//Ставим позицию в конец файла

tmp3->Seek(0,soFromEnd);

//Записываем буфер в файл

tmp3->WriteBuffer(buf,m);

if(tmp3->Size==recieve.size.ToInt())

{ tmp3->Position=0;

SavingFile(tmp3,recieve.name);

String gh;

gh=recieve.name.SubString(recieve.name.AnsiPos(".")+1,recieve.name.Length());

gh=gh.SubString(gh.AnsiPos(".")+1,gh.Length());

gh=gh.SubString(gh.AnsiPos(".")+1,gh.Length());

gh=gh.SubString(gh.AnsiPos(".")+1,gh.Length());

if((gh!="syn")&&(gh!="psw"))

{ Event->GetKey("server");

Event->GetSync(recieve.ip+"\\"+recieve.ip);

Event->Decrypt(recieve.ip+"\\"+recieve.name); }

if(gh=="psw")

Form1->Autentification(recieve.ip,TN);

cnt1=0; }

//Закрываем файл

if(cnt1!=0)tmp3->Free();

if(cnt1==0)

{ tmp3=new TFileStream("file03.tmp",fmCreate);

delete tmp3; }

//Освобождаем память

delete buf; }}

void __fastcall TForm1::ServerSocket1GetSocket(TObject *Sender, int Socket,

TServerClientWinSocket *&ClientSocket)

{ ListBox1->Items->Add(DateToStr(Date())+" "+TimeToStr(Time())+" "+"Get socket");}

void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)

{ f->Position=f->Size;

ListBox1->Items->SaveToStream(f);}

//Сохранить список

void __fastcall TForm1::Button3Click(TObject *Sender)

{ N2->Enabled=true; N6->Enabled=false;

Button1->Enabled=true; Button4->Enabled=false;

Button3->Enabled=false; AllUsers->Options>>goEditing;

//Создаём файл с числом пользователей

TFileStream* cfg = new TFileStream("file01.cfg",fmCreate);

TFileStream* l = new TFileStream("1.lst",fmCreate);

//определяем число строк в таблице которое необходимо сохранить

j=1; for(i=1;i<30;i++)

{ if(AllUsers->Cells[0][i]=="") break; j++; }

Label1->Caption=(AnsiString)(j-1);

counter=Label1->Caption.Length();

//char* cnt=new byte(counter);

//cnt=Label1->Caption.c_str();

cfg->Write(Label1->Caption.c_str(),counter);

for(i=1;i<j;i++)

{ l->Position=l->Size;

AllUsers->Rows[i]->SaveToStream(l); }

l->Free(); cfg->Free(); //delete cnt;}

//Загружаем список пользователей

void __fastcall TForm1::Button4Click(TObject *Sender)

{ String jh;

//Выделяем память под число строк

N2->Enabled=true; Button1->Enabled=true;

Button3->Enabled=false; Button4->Enabled=false; N5->Enabled=false; N7->Enabled=false; Button5->Enabled=false; AllUsers->Options>>goEditing;

//файл с числом пользователей

TFileStream* cf = new TFileStream("file01.cfg",fmOpenRead);

//создаём временный файл

TFileStream* tmp = new TFileStream("file01.tmp",fmCreate);

//Создаём поток для файла

TFileStream* fl = new TFileStream("1.lst",fmOpenRead);

fl->Position=0;

//задаём число считываемых байт

counter=cf->Size;

char cnt[2];//*cnt=new char(counter);

//char *cnt=new byte(counter);

cf->Position=0;

cf->Read((void*)cnt,counter);

jh=jh+cnt[0]; jh=jh+cnt[1];

//записываем число всех клиентов в соответсвующий пункт

delete cf;

Label1->Caption=jh;//*cnt;

counter=Label1->Caption.ToInt();

//Считываем в список всех клиенто в из файла

for(i=1;i<counter+1;i++)

{ //хитрая процедура записи в таблицу

//с использ. временного файла

fl->Position=tmp->Size;

AllUsers->Rows[i]->LoadFromStream(fl);

AllUsers->Rows[i]->SaveToStream(tmp); }

fl->Free(); tmp->Free(); //delete cnt;

DeleteFile("file01.tmp");}

//Возможность редактирования таблицы

void __fastcall TForm1::Button5Click(TObject *Sender)

{ N5->Enabled=false; N6->Enabled=true; N7->Enabled=false;

Button3->Enabled=true; Button4->Enabled=false; Button5->Enabled=false;

AllUsers->Options<<goEditing;}

//Процедура выполняемая по таймеру

void __fastcall TForm1::TimerTimer(TObject *Sender)

{ Timer->Interval=2000;

if(ServerSocket1->Socket->OnClientDisconnect)

{ for(i=0;i<5;i++)

for(k=1;k<30;k++)

{ ActiveUsers->Cells[i][k]="";

ipadr[k-1]=""; }

Form1->ActivatedUsers(); }; }

//Нажата кнопка "Открыть файл для передачи"

void __fastcall TForm1::Button6Click(TObject *Sender)

{ int nom,l;

static sd;

if(SendMenu->Text!="")

{ if(FileSend->Execute())

{ if(sd>=1)

{ delete tmp2; }

s1=NameOfFile(FileSend->FileName);

Edit2->Text=s1;

Event->GenerSync();

/*Tlong p,e,n1;

TFileStream *nk=new TFileStream("server.~syn",fmCreate);

TFileStream *nk2=new TFileStream("server.syn",fmOpenRead);

nk->CopyFrom(nk2,nk2->Size);

delete nk2;

RSA->Symb2Num("server.syn");

p=RSA->ReadLong("server.syn");

e=RSA->ReadLong("client1.ok");

n1=RSA->ReadLong("client1.mod");

p=RSA->Crypt(p,e,n1);

RSA->WriteLong(p,"server.syn");*/

Time2->Caption=DateToStr(Date())+" "+TimeToStr(Time());

FileSending("server.syn",SendMenu->Text);

nk->Position=0;

nk3->CopyFrom(nk,nk->Size);

delete nk; delete nk3; Sleep(30000);*/

Event->ProcessCrypt(s1.c_str(),false);

fs = new TFileStream("file02.tmp",fmOpenRead);

//fs = new TFileStream(FileSend->FileName,fmOpenRead);

tmp2= new byte[fs->Size];

fs->Read(tmp2,fs->Size);

//для приёма файла клиентом

snd.ip=SendMenu->Text;

snd.name=s1;

snd.size=(String)fs->Size;

for(l=0;l<=(ServerSocket1->Socket->ActiveConnections-1);l++)

{ if(snd.ip==ServerSocket1->Socket->Connections[l]->RemoteAddress) nom=l; }

ServerSocket1->Socket->Connections[nom]->SendText(snd.ip+"//"+snd.name+"///"+snd.size);

Sleep(1000);

ServerSocket1->Socket->Connections[nom]->SendBuf(tmp2,snd.size.ToInt());

sd++; v++;

Label3->Caption=(String)v;

if(v>=2)

{ SendTable->RowCount=v+1;

SendTable->Cells[0][v]=snd.name;

SendTable->Cells[1][v]=snd.ip; }

else { SendTable->Cells[0][1]=snd.name;

SendTable->Cells[1][1]=snd.ip; }

delete fs;

//DeleteFile("file02.tmp");

ListBox1->Items->Add(DateToStr(Date())+" "+TimeToStr(Time())+" "+"File "+"'"+s1+"'"+" sended to "+snd.ip); }

} else {Application->MessageBox("Выберите клиента сети для отправки файла!", NULL, MB_OK);} }

void __fastcall TForm1::N9Click(TObject *Sender)

{ f->Position=f->Size;

ListBox1->Items->SaveToStream(f);

Form1->Close();}

void __fastcall TForm1::N13Click(TObject *Sender)

{ AboutBox->Visible=true; }

void __fastcall TForm1::Button7Click(TObject *Sender)

{ Tlong pk, qk, nnk, fi, ek, dk;

pk=RSA->GenSimple(256);//prostoe (...) bitnoe chislo

qk=RSA->GenSimple(256);//prostoe (...) bitnoe chislo

nnk=RSA->Mul_Long(pk,qk);//nnk=pk*qk

pk.Tlg[1]--; qk.Tlg[1]--;

fi=RSA->Mul_Long(pk,qk);//fi=(p-1)*(q-1)

for(int L=0;L<1000;L++) ek.Tlg[L]=0;

while(dk.Tlg[0]==0)

{ ek=RSA->GenOpenKey(18);//256-18, 32-2

dk=RSA->GenSecretKey(ek,fi); //Extended Euklid }

String namefile;

mkdir("keys");

namefile="keys\\"+Edit3->Text+".ok";

RSA->WriteLong(ek,namefile.c_str());

namefile="keys\\"+Edit3->Text+".pk";

RSA->WriteLong(dk,namefile.c_str());

namefile="keys\\"+Edit3->Text+".mod";

RSA->WriteLong(nnk,namefile.c_str());

}

ПРИЛОЖЕНИЕ Б

Листинг программы

Данное приложение содержит исходный программный код клиентской части транспортной подсистемы обнаружения атак.

#include <vcl.h>

#pragma hdrstop

USERES("NetClient.res");

USEFORM("Client.cpp", Form1);

USEFORM("form.cpp", Eventa);

USEFORM("aboutNS.cpp", AboutBox);

USEFORM("PROj.cpp", RSA);

WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)

{ try {

Application->Initialize();

Application->CreateForm(__classid(TForm1), &Form1);

Application->CreateForm(__classid(TEventa), &Eventa);

Application->CreateForm(__classid(TAboutBox), &AboutBox);

Application->CreateForm(__classid(TRSA), &RSA);

Application->Run(); }

catch (Exception &exception)

{ Application->ShowException(&exception); }

return 0;}

#include <vcl.h> #include <stdio.h> #include <conio.h> #include <io.h>

#include <fcntl.h> #pragma hdrstop #include "form.h"

#pragma package(smart_init) #pragma resource "*.dfm"

TEventa *Eventa;

unsigned long int X[8],GX[8];

unsigned long int N[2]; //64-

unsigned long int Sync[2],GSync[2]; //

int inHandle; int outHandle; //

int Err=0;int gen, gensync;

void TEventa::GetSync(String name)

{ TFileStream* sk = new TFileStream("server.syn",fmOpenRead);

byte* _tm;

_tm = new byte[4];

for(int f=0;f<2;f++)

{ sk->ReadBuffer(&_tm,4);

Sync[f]=(unsigned long int)_tm; }

delete sk;}

void TEventa::GetKey(String name)

{ TFileStream* sk = new TFileStream("server.key",fmOpenRead);

byte* _tm;

_tm = new byte[4];

for(int f=0;f<8;f++)

{ sk->ReadBuffer(&_tm,4);

X[f]=(unsigned long int)_tm; }

delete sk;}

unsigned long int TEventa::s2s(int d)

{ int q,j; q=2; if(d==0) return 1;

j=s2s(d-1)*q;

return j;}

void TEventa::GenerKey()

{ unsigned long int _tmp;

byte* _tm;

randomize();

_tm = new byte[4];

TFileStream *sk =new TFileStream("server.key",fmCreate);

for(int f=0;f<8;f++)

{ for(int o=0;o<32;o++)

{ gen=random(2);

X[f]=X[f]+gen*s2s(o); }

_tm=(byte*)X[f];

sk->WriteBuffer(&_tm,4);

sk->Position=sk->Size; }

delete sk;}

void TEventa::GenerSync(String nb)

{ unsigned long int _tmp;

byte* _tm;

_tm = new byte[4];

TFileStream *sk =new TFileStream(nb,fmCreate);

randomize();

for(int f=0;f<2;f++)

{ for(int o=0;o<32;o++)

{ gensync=random(2);

Sync[f]=Sync[f]+gensync*s2s(o); }

_tm=(byte*)Sync[f];

sk->WriteBuffer(&_tm,4);

sk->Position=sk->Size; }

delete sk;}

unsigned long int TEventa::shift_l(unsigned long int var)

{ unsigned long int tmp;

tmp=var; var=var & 0x80000000;

var=var>>31; tmp=tmp<<1; var=var+tmp;

return var;}

void TEventa::Base_step(unsigned long int *N,unsigned long int key)

{ struct b_32 {

unsigned int b1:4;

unsigned int b2:4;

unsigned int b3:4;

unsigned int b4:4;

unsigned int b5:4;

unsigned int b6:4;

unsigned int b7:4;

unsigned int b8:4; };

union bit32{

unsigned long int S;

struct b_32 S_4b;

}SS;

SS.S=N[0] + key;

SS.S_4b.b1 = H[SS.S_4b.b1][0].b4;

SS.S_4b.b2 = H[SS.S_4b.b2][1].b4;

SS.S_4b.b3 = H[SS.S_4b.b3][2].b4;

SS.S_4b.b4 = H[SS.S_4b.b4][3].b4;

SS.S_4b.b5 = H[SS.S_4b.b5][4].b4;

SS.S_4b.b6 = H[SS.S_4b.b6][5].b4;

SS.S_4b.b7 = H[SS.S_4b.b7][6].b4;

SS.S_4b.b8 = H[SS.S_4b.b8][7].b4;

for (int i=0;i<11;i++) SS.S=shift_l(SS.S);

SS.S=SS.S ^ N[1];

N[1]=N[0]; N[0]=SS.S;};

void TEventa::Crypt(unsigned long int *N)

{ for (int k=0;k<3;k++){

for (int j=0;j<8;j++) Base_step(N,X[j]); }

for (int i=7;i>=0;i--) Base_step(N,X[i]);

//swap N1 <-> N2

unsigned long int tmp;

tmp=N[0]; N[0]=N[1]; N[1]=tmp; }//end Crypt

void TEventa::ProcessCrypt(char* flname,bool Decrypt)

{ if ((inHandle = open(flname, O_BINARY | O_RDONLY)) == -1)

{ Err++; }

if ((outHandle = open("file02.tmp", O_BINARY|O_TRUNC|O_WRONLY)) == -1) { Err++; }

if (Err==0) { int inSize;

while((inSize = read(inHandle, N, 8)) != 0)

{ Crypt(Sync);

Sync[0]=N[0] ^ Sync[0];

Sync[1]=N[1] ^ Sync[1];

write(outHandle, Sync, inSize);

if (Decrypt==true)

{ Sync[0]=N[0]; Sync[1]=N[1]; } }

close(inHandle); close(outHandle); } }

void TEventa::Decrypt(String dname) {

Eventa->ProcessCrypt(dname.c_str(),true);

DeleteFile(dname);

TFileStream *dec =new TFileStream(dname,fmCreate);

TFileStream *dc =new TFileStream("file02.tmp",fmOpenRead);

dec->CopyFrom(dc,dc->Size);

delete dec; delete dc;}

__fastcall TEventa::TEventa(TComponent* Owner)

: TForm(Owner){}

#include <vcl.h> #pragma hdrstop #include "Client.h" #include "form.h"

#include "aboutNS.h" #include "PROj.h"

#pragma package(smart_init) #pragma resource "*.dfm"

TForm1 *Form1;

struct send { String ip; String name; String size; }snd;

String str,s1,FileN;

byte* tmp2,*tmps;

int cnt,sd,get;

TFileStream* event2 = new TFileStream("events.txt",fmOpenReadWrite);

TFileStream *fss, *fs;

void TForm1::FileSending(String name,String ipad){

int nomer,x;

static int st; if(st>=1) { delete tmps; }

fss = new TFileStream(name,fmOpenRead);

tmps= new byte[fss->Size];

fss->Read(tmps,fss->Size);

snd.ip=ClientSocket1->Socket->LocalAddress;

snd.name=name; snd.size=(String)fss->Size;

ClientSocket1->Socket->SendText(snd.ip+"//"+snd.name+"///"+snd.size);

Sleep(1000);

ClientSocket1->Socket->SendBuf(tmps,snd.size.ToInt());

st++; sd++; Label5->Caption=(String)sd; if(sd>=2)

{ SendTable->RowCount=sd+1; SendTable->Cells[0][sd]=snd.name;

SendTable->Cells[1][sd]=snd.ip; } else { SendTable->Cells[0][1]=snd.name; SendTable->Cells[1][1]=snd.ip; }

delete fss; Events->Items->Add(DateToStr(Date())+" "+TimeToStr(Time())+" "+"File "+"'"+name+"'"+" sended to server");}

//Получение имени файла из строки

String TForm1::NameOfFile(AnsiString FileName)

{ int m; FileN= FileName.c_str(); m=FileN.LastDelimiter("\\"); FileN.Delete(1,m);

return FileN; }

//Сохранение файла

void TForm1::SavingFile(TFileStream* fs, String FileName)

{ TFileStream* save = new TFileStream(FileName,fmCreate);

save->CopyFrom(fs,fs->Size);

Events->Items->Add(DateToStr(Date())+" "+TimeToStr(Time())+" "+"File '"+FileName+"' recieved");

get++; Label6->Caption=(String)get;

if(get>=2)

{ GetTable->RowCount=get+1;

GetTable->Cells[0][get]=snd.name;

GetTable->Cells[1][get]=snd.ip; }

else { GetTable->Cells[0][1]=snd.name;

GetTable->Cells[1][1]=snd.ip; }

delete save; delete fs;}

__fastcall TForm1::TForm1(TComponent* Owner)

: TForm(Owner){

GetTable->Cells[0][0]="Файл";

GetTable->Cells[1][0]="От сервера";

SendTable->Cells[0][0]="Файл";

SendTable->Cells[1][0]="Серверу";}

//Кнопка Установить соединение

void __fastcall TForm1::Button1Click(TObject *Sender) {

Button2->Enabled=true; N11->Enabled=true; Button1->Enabled=false; N10->Enabled=false; Button4->Enabled=true; //Адрес сервера и порт

ClientSocket1->Address=Address->Text;

ClientSocket1->Port=Port->Text.ToInt();

//Открытие сокета

ClientSocket1->Open();

//События

Events->Items->Add(DateToStr(Date())+" "+TimeToStr(Time())+" "+"Client starting");

Events->Items->Add(DateToStr(Date())+" "+TimeToStr(Time())+" "+"Connection on port "+Port->Text); }

//Кнопка Разорвать соединение

void __fastcall TForm1::Button2Click(TObject *Sender) {

Button1->Enabled=true; N10->Enabled=true; Button2->Enabled=false;

N11->Enabled=false; Button4->Enabled=false;

//Закрытие сокета

ClientSocket1->Close(); //События

Events->Items->Add(DateToStr(Date())+" "+TimeToStr(Time())+" "+"Client stopped"); }

void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)

{ event2->Position=event2->Size; Events->Items->SaveToStream(event2);}

void __fastcall TForm1::Button3Click(TObject *Sender){

if(Password->Text==PasswordCheck->Text) {

Button1->Enabled=true; N10->Enabled=true; N9->Enabled=false;

Button3->Enabled=false; Password->Enabled=false; PasswordCheck->Enabled=false; }

else { Application->MessageBox("Введите пароль заново!","Ошибка ввода паполя",MB_OK);

Password->Clear();

PasswordCheck->Clear(); } }

void __fastcall TForm1::ClientSocket1Read(TObject *Sender,

TCustomWinSocket *Socket){

int l; char *buf; TFileStream* tmp;

if(cnt==0) {

str=ClientSocket1->Socket->ReceiveText();

snd.ip=str.SubString(1,str.AnsiPos("//")-1);

str=str.SubString(str.AnsiPos("//")+2,str.Length());

snd.name=str.SubString(1,str.AnsiPos("///")-1);

snd.size=str.SubString(str.AnsiPos("///")+3,str.Length());

cnt++; } if(cnt>=1) {

//Записываем в l размер полученного блока

l=ClientSocket1->Socket->ReceiveLength();

//Занимаем память для буфера}

buf=new char[l+1];

//Записываем в буфер полученный блок

ClientSocket1->Socket->ReceiveBuf(buf,l);

//Открываем временный файл для записи

tmp=new TFileStream("file01.tmp",fmOpenReadWrite);

//Ставим позицию в конец файла

tmp->Seek(0,soFromEnd);

//Записываем буфер в файл

tmp->WriteBuffer(buf,l);

if(tmp->Size==snd.size.ToInt()) {

tmp->Position=0;

SavingFile(tmp,snd.name);

if(snd.name=="server.key") DateKey->Caption=DateToStr(Date())+" "+TimeToStr(Time());

if(snd.name=="server.syn") ServSync->Caption=DateToStr(Date())+" "+TimeToStr(Time()); String gh;

gh=snd.name.SubString(snd.name.AnsiPos(".")+1,snd.name.Length());

if((gh!="syn")&&(gh!="key"))

{ Eventa->GetKey("server");

Eventa->GetSync("server");

Eventa->Decrypt(snd.name); }

if(gh=="key")

{ Tlong p,d,n1;

p=RSA->ReadLong("server.key");

d=RSA->ReadLong("client1.pk");

n1=RSA->ReadLong("client1.mod");

p=RSA->Crypt(p,d,n1);

RSA->WriteLong(p,"server.key");

RSA->Num2Symb("server.key"); }

/*if(gh=="syn")

{ Tlong p1,d1,n2;

p1=RSA->ReadLong("server.syn");

d1=RSA->ReadLong("client1.pk");

n2=RSA->ReadLong("client1.mod");

p1=RSA->Crypt(p1,d1,n2);

RSA->WriteLong(p1,"server.syn");

RSA->Num2Symb("server.syn"); } */

cnt=0; }

//Закрываем файл

if(cnt!=0)tmp->Free(); if(cnt==0)

{ tmp=new TFileStream("file01.tmp",fmCreate);

delete tmp; }

//Освобождаем память

delete buf; } }

void __fastcall TForm1::ClientSocket1Disconnect(TObject *Sender,

TCustomWinSocket *Socket) {

Events->Items->Add(DateToStr(Date())+" "+TimeToStr(Time())+" "+"Client disconnected");

Button1->Enabled=false; N10->Enabled=false; Button2->Enabled=false;

N11->Enabled=false; Button3->Enabled=true; N9->Enabled=true;

Button4->Enabled=false;

Password->Clear(); PasswordCheck->Clear(); Password->Enabled=true;

PasswordCheck->Enabled=true;}

void __fastcall TForm1::Button4Click(TObject *Sender) {

int nom,l; static int v; if(FileSend->Execute())

{ if(v>=1) { delete tmp2; }

s1=NameOfFile(FileSend->FileName); Edit1->Text=s1; Eventa->GenerSync(ClientSocket1->Socket->LocalAddress+".syn");

TextSync->Caption=ClientSocket1->Socket->LocalAddress+".syn";

DateSync->Caption=DateToStr(Date())+" "+TimeToStr(Time());

Eventa->GetKey("server");

FileSending(ClientSocket1->Socket->LocalAddress+".syn",Address->Text);

Eventa->ProcessCrypt(s1.c_str(),false);

fs = new TFileStream("file02.tmp",fmOpenRead);

//TFileStream* fs = new TFileStream(FileSend->FileName,fmOpenRead);

tmp2= new byte[fs->Size]; fs->Read(tmp2,fs->Size);

//Для приёма файла сервером

snd.ip=ClientSocket1->Socket->LocalAddress;

snd.name=s1; snd.size=(String)fs->Size;

ClientSocket1->Socket->SendText(snd.ip+"//"+snd.name+"///"+snd.size);

Sleep(1000);

ClientSocket1->Socket->SendBuf(tmp2,snd.size.ToInt());

v++; sd++; Label5->Caption=(String)sd; if(sd>=2)

{ SendTable->RowCount=sd+1;

SendTable->Cells[0][sd]=snd.name;

SendTable->Cells[1][sd]=snd.ip; }

else { SendTable->Cells[0][1]=snd.name;

SendTable->Cells[1][1]=snd.ip; }

delete fs;

Events->Items->Add(DateToStr(Date())+" "+TimeToStr(Time())+" "+"File "+"'"+s1+"'"+" sended to server"); } }

void __fastcall TForm1::ClientSocket1Connect(TObject *Sender,

TCustomWinSocket *Socket)

{ Tlong e,p,n; String nnn;

//Работа с паролем

TFileStream *ps =new TFileStream(ClientSocket1->Socket->LocalAddress+".psw",fmCreate);

ps->Write(Password->Text.c_str(),16);

delete ps; nnn=ClientSocket1->Socket->LocalAddress+".psw";

RSA->Symb2Num(nnn);

p=RSA->ReadLong(nnn.c_str());

e=RSA->ReadLong("server.ok");

n=RSA->ReadLong("server.mod");

p=RSA->Crypt(p,e,n);

RSA->WriteLong(p,nnn.c_str());

Form1->FileSending(nnn,Address->Text);

DeleteFile(ClientSocket1->Socket->LocalAddress+".psw");}

void __fastcall TForm1::N2Click(TObject *Sender)

{ event2->Position=event2->Size;

Events->Items->SaveToStream(event2);

Form1->Close();}

void __fastcall TForm1::N7Click(TObject *Sender)

{ AboutBox->Visible=true;}

#include <vcl.h> #include <conio.h> #include <stdio.h> #include <stdlib.h>

#include <string.h> #include <math.h>

#pragma hdrstop #include "PROj.h"

#pragma package(smart_init) #pragma resource "*.dfm"

TRSA *RSA;

const MaxDig = 1000,//максимальное количество четырехзначных цифр

Osn = 10000;//основание системы счисления

Tlong p,q,nn,fi,e,d,M,C; int count; int L;

//-----------процедура считывания длинного числа из файла name----------

Tlong TRSA::ReadLong(char *name)

{ FILE *rl; Tlong a; char ch; int h;

for(int i=0;i<MaxDig;i++) {

a.Tlg[i]=0; //обнуление элементов массива }

a.znak=0; //знак длинного числа: 0-положительное; 1-отрицательное

rl=fopen(name,"r"); ch=getc(rl); while(ch!='\n')

{ for(int i=a.Tlg[0];i>=1;i--)

{//протаскивание старшей цифры в числе из A[i]в младшую цифру числа из A[i+1]

a.Tlg[i+1]=a.Tlg[i+1]+((long int)a.Tlg[i]*10)/Osn;

a.Tlg[i]=((long int)a.Tlg[i]*10)%Osn; }

//добавляем младшую цифру к числу из А[1]

a.Tlg[1]=a.Tlg[1]+(long int)ch-(long int)'0';

//изменяем число задействованных элементов

if(a.Tlg[a.Tlg[0]+1]>0) a.Tlg[0]++;

ch=getc(rl); } fclose(rl); return a; }

Tlong TRSA::GenSimple(int dlina) {

const int dl_reg=34;//dlina registra

int reg[dl_reg];//registr

int n, m, t, tmp, priznak; int chisla[512]; int

Tlong x,y,z,ad,x_1;//x - testiryemoe dlinnoe chislo

n=dlina; m=13; // y - vce po porydku iz Mas_Simple; z=x mod y

randomize(); priznak=0;

while(priznak!=1) // ecli priznak=1 - prostoe chislo naydeno

// ecli priznak=0 - prodolgenie poiska {

for(int u=0;u<dl_reg;u++) reg[u]=random(2);//nachalnoe zapolnenie registra

//---------------generacia bit dlinnogo chusla-----------------------------

for(int u=0;u<n;u++)

{ tmp=reg[33]^reg[32]^reg[29]^reg[28]^reg[27]^reg[0];

chisla[u]=reg[dl_reg-1];

for (int qw=dl_reg-1;qw>0;qw--) reg[qw]=reg[qw-1];

reg[0]=tmp; }

for(int u=0;u<MaxDig;u++) x.Tlg[u]=0;//obnylenie

for(int u=0;u<MaxDig;u++) y.Tlg[u]=0;// t=0;

chisla[0]=1; // krainie bit=1

chisla[n-1]=1;//

for(int u=0;u<m;u++) t+=chisla[n-1-u]*pow(2,u);//znachenie mladshix 13 bit

//printf("\n"); printf("%d",t); getch();

x.Tlg[0]=1; x.Tlg[1]=t;//nachalnoe znachenie dlinnogo chisla

y.Tlg[0]=1; y.Tlg[1]=8192;//vspomogatelnyi massiv dlya perevoda bin->dec

for(int u=m;u<n;u++)

{// perevod bin->dec; formirovanie dlinnogo chisla

if(chisla[n-1-u]==1) x=SumLongTwo(x,y);

y=SMul(y,2); }

for(int u=0;u<MaxDig;u++) y.Tlg[u]=0;

y.Tlg[0]=1;

//nachalo proverki na prostoty - delenie na prostie chisla do 2000

for(int u=0;u<303;u++) {

y.Tlg[1]=Mas_Simple[u];//y.Tlg[1] - i-oe chislo iz Mas_Simple

z=Long_Mod_Long(x,y);// vichislenie ostatka

if(z.Tlg[1]==0)// sravnenie ostatka c 0

{ priznak=0; //chislo sostavnoe, prodolgenie poiska

break;//vixod iz for; idem na nachalo while

} else priznak=1; // chislo proshlo nachalnyu proverky }

//-----------------------------test Rabina Millera--------------------------

if (priznak==1) {

chisla[n-1]=0;// x-1 v binary form

x_1=x;

x_1.Tlg[1]--;//x-1 v dec forme

y.Tlg[1]=1;

//proverka chisla x; berem neckolko(iter) znacheni ad

for(int iter=0;iter<10;iter++) {

for( int u=0;u<MaxDig;u++) ad.Tlg[u]=0;//--

int kol=random(18)+1;//--

ad.Tlg[0]=kol;//-- generacia clychainogo chisla a dlya testa R-M

for(int u=1;u<=kol;u++) ad.Tlg[u]=random(10000);//--

for(int u=0;u<MaxDig;u++) z.Tlg[u]=0;

for(int u=0;u<n;u++)

{ z=y; y=Mul_Long(y,y); y=Long_Mod_Long(y,x);

if( (y.Tlg[0]==1) && (y.Tlg[1]==1) && (z.Tlg[1]!=1) && (More(z,x_1,0)!=2) )

{ priznak=0; break; }

if(chisla[u]==1)

{ y=Mul_Long(y,ad); y=Long_Mod_Long(y,x); }

}//end for vichislenie ad^(x-1) mod x

//proverka ad^(x-1) mod x = 1

if( (y.Tlg[0]==1) && (y.Tlg[1]==1) && (priznak==1) ) priznak=1;

else { priznak=0; break; }// end else

}//end proverka x dlya neskolkix ad }//end if }//end while return x;}

//-----------------------------GenOpenKey---E--------------------------------

Tlong TRSA::GenOpenKey(int dlina_e)

{ Tlong proE;

for(int i=0;i<MaxDig;i++) proE.Tlg[i]=0;

proE.Tlg[0]=dlina_e;

for(int i=1;i<=dlina_e;i++) proE.Tlg[i]=random(10000);

return proE;}

//---------------------------GenSecretKey---D--------------------------------

Tlong TRSA::GenSecretKey(Tlong e1, Tlong fi1)

{ Tlong proD,x1,x2,x3,y1,y2,y3,Q,t1,t2,t3;

for(int kl=0;kl<MaxDig;kl++) {

x1.Tlg[kl]=0; x2.Tlg[kl]=0; x3.Tlg[kl]=0;

y1.Tlg[kl]=0; y2.Tlg[kl]=0; y3.Tlg[kl]=0;

t1.Tlg[kl]=0; t2.Tlg[kl]=0; t3.Tlg[kl]=0;

proD.Tlg[kl]=0; Q.Tlg[kl]=0; }

x1.znak=0; x2.znak=0; x3.znak=0;

y1.znak=0; y2.znak=0; y3.znak=0;

t1.znak=0; t2.znak=0; t3.znak=0;

proD.znak=0; Q.znak=0;

x1.Tlg[0]=1; x1.Tlg[1]=1;

y2.Tlg[0]=1; y2.Tlg[1]=1;

x3=fi1; y3=e1;

while (y3.znak==0) {

if (y3.Tlg[1]==0) break;

if( (y3.Tlg[0]==1) && (y3.Tlg[1]==1) ) {proD=y2; break;}

Q=Long_Div_Long(x3,y3);

if ( (x3.znak==0) && (y3.znak==0) ) Q.znak=0;

if ( (x3.znak==1) && (y3.znak==1) ) Q.znak=0;

if ( ((x3.znak==1) && (y3.znak==0)) || ((x3.znak==0) && (y3.znak==1)) ) Q.znak=1;

t1=Sub_Znak(x1,Q,y1); t2=Sub_Znak(x2,Q,y2); t3=Sub_Znak(x3,Q,y3);

x1=y1; x2=y2; x3=y3; y1=t1; y2=t2; y3=t3; }

if(proD.znak==1) proD=Sub(fi1,proD,0);

return proD;}

//--------------------Vozvedenie v stepen po modyly--------------------------

Tlong TRSA::Crypt(Tlong Osnov, Tlong Stepen, Tlong Modul)

{ int count;

Tlong DVA, BinBit, Ostatok;

int Mas_Bin[512]; int BUFF;

for(int r=0;r<MaxDig;r++)

{ DVA.Tlg[r]=0; Ostatok.Tlg[r]=0; BinBit.Tlg[r]=0; }

//predstavlenie stepeni v binary form - massiv Mas_Bin

DVA.Tlg[0]=1; DVA.Tlg[1]=2; count=0;

while ( Stepen.Tlg[1]!=1 || Stepen.Tlg[0]!=1 )

{ BinBit=Long_Mod_Long(Stepen,DVA);

Mas_Bin[count]=BinBit.Tlg[1];

Stepen=Long_Div_Long(Stepen,DVA);

count++; }

Mas_Bin[count]=Stepen.Tlg[1];

for(int r=0;r<((count+1)/2);r++)

{ BUFF=Mas_Bin[r]; Mas_Bin[r]=Mas_Bin[count-r];

Mas_Bin[count-r]=BUFF; }

//------------------vozvedenie v stepen po modyly----------------------------

Ostatok.Tlg[0]=1; Ostatok.Tlg[1]=1;

for(int r=0;r<=count;r++) {

Ostatok=Mul_Long(Ostatok,Ostatok);

Ostatok=Long_Mod_Long(Ostatok,Modul);

if(Mas_Bin[r]==1) {

Ostatok=Mul_Long(Ostatok,Osnov);

Ostatok=Long_Mod_Long(Ostatok,Modul); } }

return Ostatok;}

void TRSA::Symb2Num(String name){

TFileStream *psw =new TFileStream(name,fmOpenRead);

int size=psw->Size;

byte *parol=new byte[size];

int ch[32];

for(int i=0;i<32;i++) ch[i]=0;

AnsiString Str;

psw->Read(parol,size);

for(int i=0;i<size;i++)

{ ch[i]=(int)(*(parol+i))+100; Str=Str+ch[i]; }

Str=Str+"\r\n";

delete psw;

TFileStream *psd=new TFileStream(name,fmCreate);

psd->Write(Str.c_str(),size*3+2);

delete psd;}

void TRSA::Num2Symb(String name)

{ TFileStream *psw =new TFileStream(name,fmOpenRead);

int size=psw->Size;

String Str1; char parol[3]; int ch[32];

for(int i=0;i<32;i++) ch[i]=0;

for(int i=0;i<((size-2)/3);i++) {

psw->Read((void*)parol,3);

for(int v=0;v<3;v++)

Str1=Str1+parol[v];

ch[i]=Str1.ToInt()-100;


Подобные документы

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.