ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

网络安全传输系统-sprint1传输子系统

2020-08-04 10:02:01  阅读:325  来源: 互联网

标签:网络安全 sprint1 SSL void filename write 传输 fd sockfd


一、产品规划与设计

   二、传输子系统

   基本框架:(1)不带安全功能的传输系统

        (2)安全加密功能

        

part1:基本传输子程序设计(不带安全加密功能)

          

   

   

  

客户端 服务器
int main(int argc,char*args[])
{
    if (argc != 2)//判断传入是否为两个参数
    {
printf("usage:./client 192.168.1.113(serverip)\n");
        exit(0);
    }
    strcpy(ipaddr, args[1]);//将服务器地址放入字符串中
    //1、建立连接
    clink();
    //2、实现上传和下载,实现菜单
    menu();
    //3、关闭连接
    close(sockfd);
    return 0;
}

int clink()
{
    //1、创建socket
sockfd=socket(AF_INET,SOCK_STREAM, 0);

    //2.1、初始化地址
memset(&sockaddr1,0, sizeof(sockaddr1));
    sockaddr1.sin_family = AF_INET;
    sockaddr1.sin_addr.s_addr = inet_addr(ipaddr);
sockaddr1.sin_port = htons(port);
//端口,跟随网络字节序
    //2、连接服务器
connect(sockfd,(struct sockaddr*)&sockaddr1, 

sizeof(sockaddr1)); return 1;

 

void main()
{
    //1、建立与客户端连接
    //1.1、创建socket、
sockfd = socket(AF_INET, SOCK_STREAM, 0);
        //1.2、绑定地址
    /*初始化地址,清零*/
bzero(&server_addr,sizeof(structsockaddr_in));
    server_addr.sin_family = AF_INET;//协议族
    //跟随网络字节序,与所有地址绑定
server_addr.sin_addr.s_addr=htonl(INADDR_ANY);
server_addr.sin_port = htons(port);
//端口,跟随网上传输 /*绑定地址*/ bind(sockfd, (struct sockaddr*)(&server_addr),
sizeof(struct sockaddr)); //1.3、监听 listen(sockfd, 5); //1.4、等待连接 while (1) { new_fd = accept(sockfd, (struct sockaddr*)
(&client_addr), &sin_size); //2、响应客户端请求 while (1) { read(new_fd, &cmd, 1); if (cmd == 'Q') { close(new_fd); break; } else handle(cmd); } close(new_fd); } close(sockfd); }

 

  

客户端操作菜单  服务器命令响应
//客户端操作菜单
void menu()
{
    while (1)
    {
printf("\n-  1.Upload Files----\n");
printf("--  2.Download Files---\n");
printf("----      3.Exit  ----\n");
    printf("Please input the Client command:");
        command = getchar();
        switch (command)
        {
        case '1': 
            //上传文件
            printf("Upload File:");
while((c=getchar()) != '\n' && c != EOF);
fgets(file_u, 30, stdin);//stdin标准输入
file_u[strlen(file_u) - 1] = '\0';
        upload_file(file_u);
        break;
        case '2': 
            //下载文件
            printf("Download File:");
while((c=getchar()) != '\n' && c != EOF);
fgets(file_d,sizeof(file_d),stdin);//stdin标准输入
    file_d[strlen(file_d) - 1] = '\0';
            download_file(file_d);
        break;
        case '3': 
            //退出程序
            quit();
        break;
        default:
printf("Please input right command\n");
            break;
        }
    }
}

 

void handle(char cmd)
{
    switch (cmd)
    {
    case 'U': {
        //接收文件名
        read(new_fd, &namesize, 4);
read(new_fd,(void*)&filename, namesize);
        filename[namesize] = '\0';
        //创建文件
fd=open(filename,O_RDWR|O_CREAT, 0777);
        //接收文件长度
        read(new_fd, &filesize, 4);
        //接收文件内容
while((count=read(new_fd,(void*)buf, 1024))>0)
        {
            write(fd, &buf, count);
            tmpsize += count;
            if (tmpsize == filesize)
                break;
        }
        close(fd);
    }break;
    case 'D': {
        //接收文件名
        read(new_fd, &namesize, 4);
    read(new_fd, filename, namesize);
        filename[namesize] = '\0';
        //找到并打开文件
        fd = open(filename, O_RDONLY);
        //发送文件长度给客户端
        stat(filename, &fstat);
write(new_fd,(void*)&(fstat.st_size), 4);
        //发送文件内容
while((count=read(fd,(void*)buf, 1024)) > 0)
        write(new_fd, &buf, count);
        close(fd);
    }break;
    }
}

 

 

客户端上传操作 客户端下载操作
//case'1'上传文件(5步曲)
void upload_file(char*filename)
{
    //1、打开要上传的文件
    fd = open(filename, O_RDONLY);//以只读的方式打开文件
    //2、发送操作符 cmd="U"
    write(sockfd, &cmd, 1);
    //3、发送要上传的文件名
    write(sockfd, (void*)&size, 4);
    write(sockfd, filename, size);
    //4、发送文件长度
    stat(filename, &fstat);//获取文件属性
write(sockfd, (void*)&(fstat.st_size), 4);
    //5、发送文件
    while ((count = read(fd, (void*)buf, 1024)) > 0)
    //读取来的数据存到buf空间,只有当count>0才将buf数据发送给服务器
    write(sockfd, &buf, count);
    close(fd);
}

 

//case'2'下载文件(5步曲)
void download_file(char* filename)
{
    //1、发送操作符 cmd="D"
    write(sockfd, (void*)&cmd, 1);
    //2、发送要下载的文件名
    write(sockfd, &size, 4);
    write(sockfd, filename, size);
    //3、创建接收文件
    fd = open(filename, O_RDONLY | O_CREAT, 0777);
//以只读方式打开文件 //4、接收文件长度 read(sockfd, &filesize, 4); //5、接收文件 while ((count = read(sockfd, (void*)&buf, 1024)) > 0) { write(fd, &buf, count); tmpsize += count; if (tmpsize == filesize) break; } close(fd); }

 

 

part2:OpenSSL加密功能

     移植OpenSSL库

  step1:解压安装文件

  step2:配置./config,新建_install用于存放库文件

      ../config  no-asm shared –prefix=/home/S5/lessno2/sprint1/openssl/openssl-1.0.0s/_install

  step3:修改Makefile交叉工具链       

       cc=arm-linux-gcc

          AR=arm-linux-ar $(ARFLAGS) r

       RANLIB=arm-linux-ranlib

  step4:编译make、 make install

  step5:将_install/lib/目录中.a、.so库文件复制到/rootfs/lib/,安装openssl库完成

part3:加密传输优化

   1、Openssl编程模型

客户端端SSL模型 服务器端SSL模型

初始化SSL(初始化、载入算法、

错误信息、产生ssl环境) ->

(创建套接字、连接服务器) ->

创建SSL ->

基于SSL收发数据 ->

关闭SSL ->

(关闭套接字)

初始化SSL ->

公钥私钥数字证书设置 ->

(创建套接字、绑定、等待连接) ->

创建SSL ->

基于SSL收发数据 ->

关闭SSL ->

(关闭套接字)

 

   

 

 

 

 

 

 

 

  2、客户端下的ssl模型

    基于ssl收发数据:将write(sockfa,~)-->SSL_write(SSL,~)-->read(sockfd,~)-->SSL_read(SSL,~)

   编译 gcc client.c -o client -lssl (增加ssl库)

  3、服务器端的SSL模型

    编译gcc server.c -o server -lssl 

  4、产生对应的公钥、私钥(全置于服务器/server/目录下)

    #openssl genrsa -out privkey.pem 2048  ->私钥

    # openssl req -new -x509 -key privkey.pem -out cacert.pem -days 1095 ->对应产生的公钥

    openssl加密传输子程序设计完成,对应产生的服务器加密所需的公钥和私钥,分别进行编译即可完成对上传、下载文件的加密传输。

    [notes]:下载到开发板上的程序需要编译产生能在开发板上运行的client

        arm-linux-gcc -I /home/S5/lessno2/sprint1/openssl/openssl-1.0.0s/_install/include/ -L 

          /home/S5/lessno2/sprint1/openssl/openssl-1.0.0s/_install/lib/ client.o -o client -lssl -lcrypto(分别指明对应头文件位置、库文件位置)

 

标签:网络安全,sprint1,SSL,void,filename,write,传输,fd,sockfd
来源: https://www.cnblogs.com/ubbdote/p/13431532.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有