Проведение анализа существующих систем защиты компьютерных систем
Обзор технологий обнаружения атак. Модуль накопления и хранения предупреждений. Алгоритм работы подсистемы. Реализация клиент-серверной технологии. Клиентская часть программы. Реализация модуля шифрования, модуля накопления и хранения предупреждений.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | дипломная работа |
Язык | русский |
Дата добавления | 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;
Подобные документы
Разработка функциональной и структурной схемы программного средства. Реализация основного модуля программы. Реализация модуля печати и модуля обновлений. Изучение взаимодействия информационных технологий, методов их интеграции и обмена данными.
дипломная работа [3,2 M], добавлен 27.10.2017Структурная диаграмма программного модуля. Разработка схемы программного модуля и пользовательского интерфейса. Реализация программного модуля: код программы; описание использованных операторов и функций. Вид пользовательской формы с заполненной матрицей.
курсовая работа [215,3 K], добавлен 01.09.2010Разработка концептуальной модели базы данных. Реализация алгоритмов и разработка управляющей программы. Разработка структуры системы управления данными. Методика проведения и результаты тестирования. Функционирование разработанного программного модуля.
курсовая работа [550,5 K], добавлен 08.06.2023Разработка алгоритма фильтрации данных, полученных с систем спутниковой навигации с помощью GNSS-модуля. Анализ работы фильтра Калмана, его программная реализация под конкретную задачу. Выбор навигационных модулей для получения данных позиционирования.
дипломная работа [3,6 M], добавлен 12.01.2016Структурная диаграмма программного модуля. Нахождение суммы элементов, находящихся над главной диагональю. Реализация программного модуля: код программы; описание использованных операторов и функций. Особенности тестирования программного модуля.
курсовая работа [146,6 K], добавлен 01.09.2010Обзор технологий и систем геоинформационных систем. Системное и функциональное проектирование программного модуля, его разработка с использованием сред программирования Visual C++ 6.0, Qt 3.3.3. Технико-экономическое обоснование данного процесса.
дипломная работа [1,2 M], добавлен 13.03.2011Реализация программного средства "Действия над матрицами". Разработка кода программного продукта на основе готовой спецификации на уровне модуля. Использование инструментальных средств на этапе отладки программного модуля. Выбор стратегии тестирования.
отчет по практике [296,1 K], добавлен 19.04.2015Постановка задачи для модуля 1С. Бухгалтерия 3.0. Анализ существующих разработок в области интегрирования данных. Информационное обеспечение модуля "Связь 1С Предприятия 8.2. с "Казначейством". Программное и технологическое обеспечение данного модуля.
курсовая работа [1,5 M], добавлен 10.06.2013Анализ графического модуля "graphics.h". Анализ функции модуля, констант, типов и его глобальных переменных. Реализация пользовательской библиотеки "mouse.h". Особенности работы с мышкой в графическом и обычном режимах, разработка программного кода.
курсовая работа [36,5 K], добавлен 02.12.2009Реляционные базы данных как часть корпоративных информационных систем, их построение по принципам клиент-серверной технологии. Основные характеристики СУБД Firebird. Проектирование базы данных для информационной системы "Компьютерные комплектующие".
курсовая работа [1,9 M], добавлен 28.07.2013