Быстрая схема аутентификации и обмена ключами, устойчивая к DDoS-атаке

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

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

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

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

int client_ini(){

FILE *ini=NULL;

ini=fopen("conin","rb");

fscanf(ini,"%d",&PORT);

fscanf(ini,"%s",&SERVERADDR);

fscanf(ini,"%d",&config_flags[0]);

fscanf(ini,"%d",&config_flags[1]);

fscanf(ini,"%d",&config_flags[2]);

fscanf(ini,"%d",&config_param[0]);

return 0;

}

int md5(unsigned char *str, unsigned char *md_value, int strlen){

EVP_MD_CTX mdctx;

const EVP_MD * md;

unsigned int md_len;

OpenSSL_add_all_digests();

md = EVP_get_digestbyname("md5");

EVP_DigestInit(&mdctx, md);

EVP_DigestUpdate(&mdctx, str, strlen);

EVP_DigestFinal(&mdctx, md_value, &md_len);

EVP_MD_CTX_cleanup(&mdctx);

return 1;

}

int do_AES(unsigned char *k, char *str, int strlen)

{

int outlen;

unsigned char key[32]; /* 256- битный ключ */

unsigned char iv[8]; /* вектор инициализации */

unsigned char inbuf[BUFSIZE], outbuf[BUFSIZE];

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

key[i]=k[i];

}

memcpy(inbuf,str,strlen);

EVP_CIPHER_CTX ctx;

const EVP_CIPHER * cipher;

EVP_CIPHER_CTX_init(&ctx);

cipher = EVP_aes_256_cfb();

EVP_EncryptInit(&ctx, cipher, key, iv);

EVP_EncryptUpdate(&ctx, outbuf, &outlen, inbuf, strlen);

memcpy(str,outbuf,strlen);

EVP_EncryptFinal(&ctx, outbuf, &outlen);

EVP_CIPHER_CTX_cleanup(&ctx);

return 1;

}

int md5_IDc(unsigned char *IDc){

EVP_MD_CTX mdctx; /* контекст для вычисления хэша */

const EVP_MD * md; /* структура с адресами функций алгоритма */

unsigned char md_value[EVP_MAX_MD_SIZE];

unsigned int md_len; /* размер вычисленного хэша */

int buf_len;

FILE *in;

in=fopen(PUBLIC_CLIENT_KEY,"r");

OpenSSL_add_all_digests();

md = EVP_get_digestbyname("md5");

EVP_DigestInit(&mdctx, md);

/* Вычисляем хэш */

char buf[BUFFSIZE];

for(;;) {

unsigned long in_len = fread(buf,1,BUFFSIZE,in);

if(in_len <= 0) break;

buf_len=in_len;

EVP_DigestUpdate(&mdctx, buf, (unsigned long)in_len);

}

EVP_DigestFinal(&mdctx, md_value, &md_len);

EVP_MD_CTX_cleanup(&mdctx);

char tmp[4];

char tmp1[33];

for(int i = 0; i < md_len*2; i+=2){

sprintf(tmp,"%02x",md_value[i/2]);

sprintf(&tmp1[i],"%c",tmp[0]);

if(i+1<32)

sprintf(&tmp1[i+1],"%c",tmp[1]);

}

memcpy(IDc,tmp1,KEYSIZE+1);

fcloseall();

return 1;

}

int to_hex(unsigned char *str_dest, unsigned char *str_src, int sstr_len){

char tmp[4],buf1[RSA_key_size+1];

for(int i=0; i<sstr_len; i+=2){

sprintf(tmp,"%02x",str_src[i/2]);

sprintf(&buf1[i],"%c",tmp[0]);

if(i+1<sstr_len)

sprintf(&buf1[i+1],"%c",tmp[1]);

}

memcpy(str_dest,buf1,sstr_len+1);

return 0;

}

int gen_session_key(unsigned char *buff){

unsigned char buf[KEYSIZE+1],session_key[KEYSIZE+1];

RAND_bytes(buf,KEYSIZE);

md5(buf,session_key,KEYSIZE+1);

to_hex(buff,session_key, KEYSIZE);

return 1;

}

int do_encrypt(unsigned char *ptext, unsigned char *ctext){

RSA * pubKey = NULL;

int outlen;

FILE * pub_key_file = NULL;

pub_key_file = fopen(PUBLIC_SERVER_KEY, "rb");

pubKey = PEM_read_RSAPublicKey(pub_key_file, NULL, NULL, NULL);

int key_size = RSA_size(pubKey);

outlen = RSA_public_encrypt(96, ptext, ctext, pubKey, RSA_PKCS1_PADDING);

if(outlen != RSA_size(pubKey)) exit(-1);

fcloseall();

return 0;

}

int pre_rsa(unsigned char *k1, unsigned char *k2, unsigned char *IDc, unsigned char *ptext){

int count=0;

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

ptext[count]=k1[i];

count++;

}

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

ptext[count]=k2[i];

count++;

}

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

ptext[count]=IDc[i];

count++;

}

return 0;

}

int do_sign(unsigned char *m, unsigned int m_len, unsigned char *ctext, unsigned int key_size){

RSA *privKey = NULL;

FILE *priv_key_file;

const EVP_CIPHER *cipher = NULL;

OpenSSL_add_all_ciphers();

cipher = EVP_get_cipherbyname("bf-ofb");

priv_key_file = fopen(PRIVAT_CLIENT_KEY, "rb");

privKey = PEM_read_RSAPrivateKey(priv_key_file, NULL, NULL, "hello");

if(RSA_sign(1,m,m_len,ctext,&key_size,privKey)==1){

}

return 0;

}

int get_IDauthkey(unsigned char *IDauthkey, unsigned char *k1){

FILE *f;

unsigned char buff[34];

if((f=fopen(IDauthkey_file,"r+"))!=NULL){

if(fread(IDauthkey,1,33,f)==0){

md5(k1,IDauthkey,32);

to_hex(IDauthkey,IDauthkey,32);

fwrite(IDauthkey,1,33,f);

fclose(f);

return 1;

}

else{

fclose(f);

md5(k1,buff,32);

to_hex(buff,buff,32);

f=fopen(IDauthkey_file,"w+");

fwrite(buff,1,33,f);

fclose(f);

return 0;

}

}

else{

f=fopen(IDauthkey_file,"w+");

md5(k1,buff,32);

to_hex(buff,buff,32);

fwrite(buff,1,32,f);

fclose(f);

return 2;

}

return (-1);

}

int get_authkey(unsigned char *authkey, unsigned char *k2){

FILE *f;

unsigned char buff[34];

if((f=fopen(authkey_file,"r+"))!=NULL){

if(fread(authkey,1,33,f)==0){

md5(k2,authkey,32);

to_hex(authkey,authkey,32);

fwrite(authkey,1,33,f);

fclose(f);

return 1;

}

else{

fclose(f);

md5(k2,buff,32);

to_hex(buff,buff,32);

f=fopen(authkey_file,"w+");

fwrite(buff,1,33,f);

fclose(f);

return 0;

}

}

else{

f=fopen(authkey_file,"w+");

md5(k2,buff,32);

to_hex(buff,buff,32);

fwrite(buff,1,32,f);

fclose(f);

return 2;

}

return (-1);

}

int make_send_package(char *package,unsigned char *P1, unsigned char *P2, unsigned char *P3, unsigned char *P4){

char buf[BUFSIZE];

int count=0;

memcpy(buf,P1,128);

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

package[count]=buf[i];

count++;

}

memcpy(buf,P2,128);

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

package[count]=buf[i];

count++;

}

memcpy(buf,P3,32);

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

package[count]=buf[i];

count++;

}

memcpy(buf,P4,128);

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

package[count]=buf[i];

count++;

}

return 0;

}

int do_DECRYPT_AES(unsigned char *k, char *str, int strlen)

{

int outlen;

unsigned char key[32];

unsigned char iv[8];

unsigned char inbuf[BUFSIZE], outbuf[BUFSIZE];

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

key[i]=k[i];

}

memcpy(inbuf,str,strlen);

EVP_CIPHER_CTX ctx;

const EVP_CIPHER * cipher;

EVP_CIPHER_CTX_init(&ctx);

cipher = EVP_aes_256_cfb();

EVP_DecryptInit(&ctx, cipher, key, iv);

EVP_DecryptUpdate(&ctx, outbuf, &outlen,inbuf, strlen);

memcpy(str,outbuf,strlen);

EVP_EncryptFinal(&ctx, outbuf, &outlen);

EVP_CIPHER_CTX_cleanup(&ctx);

return 0;

}

int replay(char *str,char *buf, unsigned char *k2){

char tmp[BUFSIZE];

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

tmp[i]=str[i+11];

}

do_DECRYPT_AES(k2,tmp,11);

tmp[11]='\0';

if(strcmp(tmp,buf)==0){

return 1;

}

return 0;

}

int dialog(char *buf,int strlen, unsigned char *session_key){

char tmp[10];

do_DECRYPT_AES(session_key,buf,strlen);

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

_itoa(i,tmp,10);

buf[i]=tmp[0];

}

do_AES(session_key,buf,strlen);

return 0;

}

int _tmain(int argc, _TCHAR* argv[])

{

SOCKET sock;

struct sockaddr_in addr;

int no_connect=0;

char buf[KEYSIZE+1],buff[BUFSIZE];

unsigned char authkey[KEYSIZE+1];

unsigned char session_key1[KEYSIZE+1], session_key2[KEYSIZE+1], IDc[KEYSIZE+1], P1[RSA_key_size+1], P2[RSA_key_size+1], P3[KEYSIZE+1], P4[RSA_key_size+1];

unsigned char ptext[RSA_key_size+1];

int byte_read,wcount=0,wlen=0,countw=0;

client_ini();

if ( WSAStartup(0x202,(WSADATA*)&buff[0])){

printf("WSAStart error %d\n", WSAGetLastError());

return -1;

}

while(1){

sock=socket(AF_INET, SOCK_STREAM, 0);

if(sock < 0){

printf("WSAStart error %d\n", WSAGetLastError());

return -1;

}

addr.sin_family=AF_INET;

addr.sin_port=htons(PORT);

if (inet_addr(SERVERADDR)!=INADDR_NONE){

addr.sin_addr.s_addr=inet_addr(SERVERADDR);

}

else{

printf("\naddr err...\n");

}

if(connect(sock, (struct sockaddr*)&addr, sizeof(addr))<0){

printf("WSAStart error %d\n", WSAGetLastError());

no_connect++;

printf("\nconnect error %d\n",no_connect);

Sleep(2000);

if(no_connect>5){

return -1;

}

}

gen_session_key(session_key1);

gen_session_key(session_key2);

md5_IDc(IDc);

pre_rsa(session_key1, session_key2, IDc, ptext);

do_encrypt(ptext,P1);

unsigned char tmp[129];

char tmp2[129];

md5(P1,tmp,128);

to_hex(tmp,tmp,KEYSIZE);

do_sign(tmp,32,P2,RSA_key_size);

memcpy(tmp2,P2,128);

do_AES(session_key1,tmp2,128);

memcpy(P2,tmp2,128);

get_IDauthkey(P3,session_key1);

get_authkey(authkey,session_key2);

memcpy(tmp2,P1,128);

if(config_flags[0]==0)

do_AES(authkey,tmp2,128);

memcpy(P4,tmp2,128);

make_send_package(buff,P1,P2,P3,P4);

if((send(sock,buff,416,0))>0){

printf("\n\n\nSEND OK!!!\n");

if(config_flags[2]!=1){

if((byte_read=recv(sock, buff, 25,0))>0){

memcpy(buf,buff,12);

buf[11]='\0';

if(replay(buff,buf,session_key2)==1){

printf("\nauth OK\n");

if(strcmp(buf,"dialogstart")==0){

if(config_flags[1]==1){

send(sock,"no",3,0);

}

else{

send(sock,"ok",3,0);

byte_read=recv(sock,buff,1000,0);

wcount=atoi(buff);

byte_read=send(sock,buff,1,0);

byte_read=recv(sock,buff,1000,0);

wlen=atoi(buff);

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

buff[i]='q';

}

do_AES(session_key2,buff,wlen);

byte_read=send(sock,buff,wlen,0);

while(countw<wcount){

if((byte_read=recv(sock, buff, wlen,0))>0){

dialog(buff,wlen,session_key2);

send(sock,buff,wlen,0);

countw++;

printf("\nmessage %d of %d\n",countw,wcount);

Sleep(config_param[0]);

}

}

}

}

}

else{

printf("\nauth FAILED!\n");

}

}

else{

}

}

}

else{

printf("\nSEND FAILED!!!\n");

}

closesocket(sock);

countw=0;

Sleep(config_param[1]);

}

return 0;

}

Размещено на www.allbest.ru


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

  • DDoS атаки. Спасение от DDoS атак. Предотвращение DDoS атак. Аппаратная защита программного обеспечения, компьютера и информации, сети. Хакинг, как сфера исследования. Типы хакеров. Методы хакинга. Защита от программ Microsoft. CMOS SETUP.

    курсовая работа [39,5 K], добавлен 06.02.2007

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

    дипломная работа [767,2 K], добавлен 23.12.2011

  • Аутентификация в Windows 2000. Преимущества аутентификации по протоколу Kerberos. Стандарты аутентификации по протоколу Kerberos. Расширения протокола и его обзор. Управление ключами, сеансовые билеты. Аутентификация за пределами домена, подпротоколы.

    курсовая работа [369,2 K], добавлен 17.12.2010

  • Модели нарушителей глобальной информационной системы Интернет. Классификация угроз в соответствии с IT-Baseline Protection Manual. Реализация DoS/DDos атак. Программная реализация Snort: установка, препроцессоры и структура модулей обнаружения и вывода.

    дипломная работа [509,5 K], добавлен 05.06.2011

  • Общая характеристика протокола ICMP, его назначение и формат сообщений. Анализ применимости протокола ICMP при переходе с набора протоколов IP v4 на набор IP v6. Свойства и принцип работы, сферы применения протоколов обмена маршрутной информацией.

    курсовая работа [210,8 K], добавлен 24.08.2009

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

    курсовая работа [586,6 K], добавлен 18.12.2011

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

    курсовая работа [861,3 K], добавлен 23.12.2014

  • Краткая история развития криптографических методов защиты информации. Сущность шифрования и криптографии с симметричными ключами. Описание аналитических и аддитивных методов шифрования. Методы криптографии с открытыми ключами и цифровые сертификаты.

    курсовая работа [1,2 M], добавлен 28.12.2014

  • Комбинированное использование симметричного и асимметричного шифрования. Зависимость между открытым и закрытым ключами. Основные недостатки симметричного шифрования. Схема двухстороннего конфиденциального обмена. Концепция шифрования по алгоритму DES.

    презентация [1,4 M], добавлен 20.12.2012

  • Создание криптографического протокола аутентификации пользователя интернет-магазина на основе биометрии, посредством Adobe Dreamweaver CS3 на языке программирования PHP. Особенности, конструкциии криптосистем. Описание алгоритма хэширования MD5.

    реферат [802,9 K], добавлен 22.01.2012

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.