Быстрая схема аутентификации и обмена ключами, устойчивая к 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