2017-2018-1 20155317《信息安全系统设计基础》 实验五 通讯协议设计
实验要求
任务
安装OpenSSL环境,并编写测试代码验证无误
研究OpenSSL算法,测试对称算法中的AES,非对称算法中的RSA,Hash算法中的MD5
在Ubuntu中实现对实验二中的“wc服务器”通过混合密码系统进行防护
1.安装OpenSSL环境,并编写测试代码验证无误
实验步骤:
$ ./config
$ make
$ make test
$ make install
进行测试,检查openssl安装是否成功:
#include <stdio.h> #include <openssl/evp.h> int main(){ OpenSSL_add_all_algorithms(); return 0; }
编译命令为:
gcc -o to test_openssl.c -L /usr/local/ssl/inlcude /usr/local/ssl/lib -ldl -lpthread
测试命令为:
echo $?
输出为0,表示成功。
在socket通信中,我编写的server部分:
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #define PORT 1234 #define BACKLOG 2 #define MAXDATASIZE 1000 void process_cli(int connectfd,struct sockaddr_in client); void sig_handler(int s); int main() { int opt,listenfd,connectfd; pid_t pid; struct sockaddr_in server; struct sockaddr_in client; int sin_size; struct sigaction act; struct sigaction oact; act.sa_handler=sig_handler; sigemptyset(&act.sa_mask); act.sa_flags=0; printf("NAME :20155317 "); if(sigaction(SIGCHLD,&act,&oact)<0) { perror("Sigaction failed! "); exit(1); } if((listenfd=socket(AF_INET,SOCK_STREAM,0))==-1) { perror("Creating socket failed. "); exit(1); } opt=SO_REUSEADDR; setsockopt(listenfd,SOL_SOCKET,SO_REUSEADDR,&opt,sizeof(opt)); bzero(&server,sizeof(server)); server.sin_family=AF_INET; server.sin_port=htons(PORT); server.sin_addr.s_addr=htonl(INADDR_ANY); if(bind(listenfd,(struct sockaddr *)&server,sizeof(struct sockaddr))==-1) { perror("Bind error. "); exit(1); } if(listen(listenfd,BACKLOG)==-1) { perror("listen() error. "); exit(1); } sin_size=sizeof(struct sockaddr_in); while(1) { if((connectfd=accept(listenfd,(struct sockaddr *)&client,&sin_size))==-1) { if(errno==EINTR) continue; perror("accept() error. "); exit(1); } if((pid=fork())>0) { close(connectfd); continue; } else if(pid==0) { close(listenfd); process_cli(connectfd,client); exit(0); } else { printf("fork error. "); exit(1); } } close(listenfd); return 0; } void process_cli(int connectfd,struct sockaddr_in client) { int i,num; char recvbuf[MAXDATASIZE]; char sendbuf[MAXDATASIZE]; char cli_name[MAXDATASIZE]; time_t t; t=time(NULL); printf("server IP%s ",inet_ntoa(client.sin_addr)); num=recv(connectfd,cli_name,MAXDATASIZE,0); if(num==0) { close(connectfd); printf("Client disconnected. "); return; } send(connectfd,(void *)&t,sizeof(time_t),0); while(num=recv(connectfd,recvbuf,MAXDATASIZE,0)) { recvbuf[num]='