# Secure-transmission-system **Repository Path**: sunset77/secure-transmission-system ## Basic Information - **Project Name**: Secure-transmission-system - **Description**: 料场自动堆取料系统的三大子系统之一——安全传输系统,该系统有三大功能:密钥协商、密钥校验和加密通信,有效保障了调度系统和扫描系统之间的通信安全。 - **Primary Language**: C++ - **License**: MulanPSL-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 2 - **Forks**: 2 - **Created**: 2021-06-16 - **Last Updated**: 2024-04-11 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Secure-transmission-system(安全传输系统) [1. 项目简介](#1-项目简介) - [1.1 项目背景](#11-项目背景) - [1.2 三大功能](#12-三大功能) [2. 主要应用技术](#2-主要应用技术) [3. 项目详解](#3-项目详解) - [3.1 系统总体架构图](#31-系统总体架构图) - [3.2 五大模块](#32-五大模块) - [3.3 系统运作流程](#33-五大模块) [4. 项目部署](#4-项目部署) - [4.1 环境](#41-环境) - [4.2 编译运行](#42-编译运行) - [4.3 单机演示](#43-单机演示) - [4.4 现场部署](#44-现场部署) ## 1. 项目简介 ### 1.1 项目背景 本系统是料场自动堆取料系统的三大子系统之一,主要负责在扫描系统和各个调度系统进行通信时,对数据进行加解密操作,以此来保障子系统之间的通信安全。 > **料场自动堆取料系统** > > 料场自动堆取料系统由若干驾驶室(客户端)和一个调度中心(服务端)组成。各个驾驶室中的**扫描系统**通过获取斗轮机臂架上激光雷达和IMU(惯性测量单元)数据,借助SLAM(同步定位与建图)技术生成料堆的三维立体图像;然后在**安全传输系统**的协助下,安全可靠地将图像传送给调度中心;调度中心的**调度系统**通过分析三维图像,生成斗轮机的运行策略,自动完成堆取料工作。系统的总体架构图如下图1所示。 > > image-20210615172316628 > >

> 图1 料场自动堆取料系统总体架构图 >

### 1.2 三大功能 1. 密钥协商 2. 密钥校验 3. 加密通信 ## 2. 主要应用技术 - C/C++ - 对称加密、单向散列函数(哈希函数)和消息认证码 - 编解码技术[ASN.1](https://blog.csdn.net/dongdong7_77/article/details/113072896) - 工厂模式 - 多线程Socket编程 - 共享内存 - MySQL数据库 ## 3. 项目详解 ### 3.1 系统总体架构图

图2 安全传输系统总体架构图

### 3.2 五大模块 1. 数据编解码模块 数据编解码模块使用的编解码技术是[**ASN.1**](https://blog.csdn.net/m0_37433111/article/details/117932156) - ASN.1定义 ASN.1(抽象语法标记)描述了一种对数据进行**表示,编码,传输和解码**的数据格式,提供了一套完整的描述对象的结构。 - 进行数据编解码的原因 由于跨平台传输过程中可能存在操作系统不同,大小端模式不同,字节对齐不同,开发语言不同等各种原因,所以需要对数据进行序列化处理。 - 将ASN.1编解码函数封装成类方便调用。 2. TCP通信模块 TCP通信模块使用的是**多线程socket编程** - socket API函数:socket setsockopt bind listen accept connect | read recv send write - 单进程socket编程存在的问题及解决办法 - 服务端:accept() 和 read() 互相阻塞,通信效率低;解决办法是使用多线程技术:主线程调用accept接受新的客户端连接, 子线程负责处理通信。 - 客户端:单进程只能处理一个连接,效率低;解决办法是使用多线程技术。 - 如果是高并发场景,考虑使用I/O多路复用技术(select poll epoll),线程池,连接池,第三方库(libevent)等。 - 理解TCP通信服务端类和客户端类的封装思想(服务端类和客户端类是依赖关系,服务端类的成员函数返回一个客户端类的对象用于通信)。 3. 共享内存模块 - 共享内存[底层原理](https://blog.csdn.net/jnu_simba/article/details/9097419) - 共享内存操作函数:shmget(创建) shmat(关联) shmdt(将shm和当前进程分离) shmctl(共享内存操作) - 将共享内存封装成类方便调用 4. 数据库模块 数据库使用的是**MySQL** - MySQL数据库基础 - 将SQL语句封装成类方便调用 5. 自定义API - 将API函数制作成动态链接库(.so),提供给扫描系统和调度系统使用,使两者之间可以进行加密通信 ### 3.3 系统运作流程 系统上电之后会首先进行密钥协商生成对称加密所需的密钥,紧接着进行密钥校验,如果一切顺利,就可以将之前编译生成的自定义API提供给扫描系统和调度系统,进行加密通信了。 系统的核心部分是密钥协商,密钥校验的过程与密钥协商类似,因此这里以密钥协商为例,讲述服务端和客户端的交互过程。(ps:在进行密钥协商之前,必须要先进行节点注册,否则会被服务端拒绝服务) 密钥协商流程: 1. 客户端发起密钥协商请求 客户端生成一个随机数r1, 同时使用HMAC算法对r1进行哈希运算,得到一个哈希值(消息认证码);然后将加密后的随机数和消息认证码等数据进行编码,发送给服务端。 2. 服务端收到请求后进行处理,并给予客户端应答 第一阶段:服务端收到请求数据之后, 首先对数据进行解码、解密;然后根据客户端ID+服务端ID查询数据库, 检验客户端是否合法;之后,通过消息认证码。验证客户端发送的随机数r1是否被篡改。 第二阶段:服务端生成随机数r2,将r1和r2进行拼接,然后使用与客户端相同的哈希算法进行哈希运算, 得到一个哈希值(密钥seckey),并将密钥信息写入共享内存和数据库;之后,服务端将随机数r2等消息进行编码、加密,发送给客户端。 3. 客户端接收服务端应答,成功生成密钥信息后,密钥协商部分结束 客户端对接收到的数据进行解码、解密,然后判断rv的值, 若rv为0表示生成密钥成功;获得服务端发来的随机字符串r2, 将r2和r1进行拼接, 之后进行哈希运算,得到密钥seckey;最后,将密钥信息写入共享内存。 ## 4. 项目部署 ### 4.1 环境 - 操作系统 ubuntu 16.04 ```bash # uname -a 查看详细信息 $ uname -a # 输出:Linux ubuntu 4.15.0-140-generic #144~16.04.1-Ubuntu SMP Fri Mar 19 21:24:12 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux ``` - 安装相关库 ```bash $ sudo apt install openssh-server $ sudo apt-get install libssl-dev $ sudo apt-get install mysql-server mysql-client $ sudo apt-get install libmysqlclient-dev ``` - 创建数据库 ```bash # 登录MySQL,xxx为数据库密码 $ mysql -u root -pxxx # 执行 .sql 文件,创建数据库 $ source ~/sec_trans_mysql.sql ``` ### 4.2 编译运行 - 编译服务端 ```bash # 打开加解密系统服务端文件夹 $ cd ~/secure-transmission-system/sec_trans_client # 编译(生成可执行文件及.so动态库(自定义API)) $ make ``` - 编译客户端 方法同服务端 - 运行 ```bash # 运行服务端(默认为守护进程,所以启动后在后台运行) $ ./svrMain # 运行服务端(命令行参数有一个整数,表示客户端id) $ ./cltMain 2 ``` ### 4.3 单机演示 - 密钥协商过程 ![演示图1](picture/演示图1.png)

图3 密钥协商过程

- 简单测试自定义API 调用自定义API,先从客户端的共享内存中取出密钥进行数据加密,然后从服务端的共享内存中取出密钥进行解密,观察数据是否发生变化。 ![演示图2](picture/演示图2.png)

图4 自定义API测试

### 4.4 现场部署 本系统作为料场自动堆取料系统的三大子系统(调度系统、扫描系统和安全传输系统)之一,现唱部署也很简单。只需要将服务端和客户端分别部署在调度中心和各个驾驶室,然后通过密钥协商各自生成密钥后,将自定义API提供给另外的子系统使用,即可进行对称加密通信,有效保障调度系统和各个扫描系统之间的通信安全。