APP下载

基于Modbus协议的数据采集与并行加密通信系统

2017-04-14张红梅张向利

计算机应用与软件 2017年3期
关键词:加密算法密钥站点

黄 剑 张红梅 张向利 陈 达

(桂林电子科技大学广西高校云计算与复杂系统重点实验室 广西 桂林 541004)

基于Modbus协议的数据采集与并行加密通信系统

黄 剑 张红梅 张向利 陈 达

(桂林电子科技大学广西高校云计算与复杂系统重点实验室 广西 桂林 541004)

为了高效、集中地监控工业设备的运行情况,设计了基于Modbus的数据采集监控系统。提出将设备管理从数据采集系统分离出来,降低动态更改设备对数据采集系统的影响,提高设备管理的便捷性。该系统引入断线自动重连机制,提升了系统的稳定性。探讨传统SM4加密算法的优缺点,提出改进的SM4加密算法,提高了安全性。结合算法的结构特点与GPU的并行计算能力,设计了基于GPU的SM4并行数据加密算法,并将该算法应用到数据采集系统中,提高了数据传输过程中的实时性。

数据采集 SM4 并行计算

0 引 言

随着物联网的发展,越来越多的企业需要将生产及运营的设备接入网络并对其进行远程实时监控,大量的设备监控数据往往需要通过互联网传输到远处的监控中心。但是,由于互联网的开放性,一旦监控数据被截获并被用于破坏活动,其带来的损失将会非常严重。因此,工业数据传输的安全性问题亟待解决。此外,随着设备数量的增加。数据量的增加,如何确保数据传输实时性、采集系统的稳定性和设备管理的便捷性也将成为一个难题。

基于以上问题,本文提出了基于Modbus的数据采集与并行加密通信系统。将设备管理从数据采集系统分离出来,降低了动态更改设备对数据采集程序的影响,提高了管理设备的便捷性。该系统引入断线自动重连机制,提升了系统的稳定性。虽然,利用SM4加密算法[1]可以确保数据传输一定的安全,但是,由于SM4密钥扩展算法与加密算法结构相似性,轮密钥生成算法参数的固定,都导致其安全性降低[2]。本文提出改进的SM4加密算法,并结合算法的结构特点与GPU的并行计算能力,设计了基于GPU的SM4并行数据加密算法,提高了数据传输过程中的安全性和实时性。

1 系统总体设计方案

设备数据监控系统采用分布式架构,分为中心控制系统、采集控制系统和通信系统等3个主要部分,如图1所示。

图1 设备数据监控系统架构图

中心控制系统实现对下属子区域各个设备的监控功能,采集控制系统实现对设备数据信息的采集及对采集到的数据进行加密转发功能,通信系统实现在中心控制系统与采集控制系统的通信。为保证监控系统的可靠性,系统需要全天24小时不间断地运行并传输着大量实时数据。因此,对数据传输过程的实时性、稳定性和安全性要求都非常高。随着业务的增加,设备的增加,对设备的动态管理提出了更高的要求。

采集控制系统是整个系统的核心,其系统组成示意如图2所示,系统主要包括主应用程序、数据采集模块、控制模块、数据加解密模块、数据转发与存储显示模块、站点配置模块,以及Modbus协议、TCP/IP协议和MySQL数据库。

图2 数据采集系统示意图

由于采集的站点数据信息量大,不适宜用单线程实现各个功能,因此采取多线程机制,把整个工作细化为若干个独立的模块,在多核的服务器上实现多线程并发操作,减少每次的采集时间。

当设备数量达到一定规模后,设备的配置信息的管理成为一个急需解决的问题。使用配置文件或程序中指定的方法不具有良好的交互性和易操作性。本文提出基于MySQL数据库的配置应用程序,根据实际的需求,产生配置信息表,存储在数据库中。将站点配置和数据采集分开,可以很方便地增加或删除站点,扩展性强、便捷性好。另外,该配置应用程序操作简单、交互性强、具有容错能力,可以预防因误操作引起的数据采集系统的崩溃。

数据采集应用程序根据配置表信息,创建并协调各个线程。数据采集模块根据主应用程序的采集信息,填充Modbus协议的各个字段,并组装成TCP/IP帧,发送出采集请求命令。该模块还从接收到的TCP/IP帧中提取出采集到的数据。该模块引入断线自动重连的机制。一旦建立的链接发生断开情况,就会立刻刷新并重新建立链接,继续发送采集请求,提高系统的稳定性。

为了提升数据在互联网上传输的安全性,在数据发送前采用改进的SM4加密算法对数据进行加密。在数据量较大的情况下,数据加密的耗时成为了实时传输的瓶颈。本文利用GPU的并行计算能力,设计了基于GPU的并行加解密模块。将数据采集过来的实时数据送给GPU,GPU把加密后的结果送给数据转发模块。数据转发模块负责把采集到的数据利用TCP/IP转发出去。数据存储模块负责把采集到的实时数据存储到数据库中。

2 配置模块应用程序

为了方便管理大规模站点设备的信息,并且各个站点的配置信息往往是随需求而改变的,因此单独设计了一个基于MySQL数据库的配置应用程序,如图3所示,可以便捷、灵活、直观地管理各个设备。站点的配置信息主要包括设备的IP地址、端口号、起始地址、采集数量等。

图3 站点配置管理应用程序

首先,通过调用MySQL数据库的接口mysql_real_connect()函数连接modbus_db数据库,若返回调用失败,说明还没有该modbus_db数据库,则调用mysql_real_query()函数创建modbus_db数据库和modbus_configure_table配置表,并初始化配置表的各个字段。

然后,打印显示菜单栏,提示用户功能选项(配置、插入、更改、删除、退出),并等待用户输入。

1) 当选择查看配置时,通过mysql_real_query()函数调用查询SQL语句,把当前所有的配置表信息打印出来。

2) 当选择更改配置时,提示用户选择需要更改的站点号,当正确输入站点号之后,打印当前的配置信息,并等待用户输入需要修改的配置项。正确输入需要修改的选项后,提示输入新的配置值,并通过mysql_real_query()接口函数调用更改SQL语句,更改配置为当前的输入值。若没有需要修改的项了,则输入q退出,返回主菜单栏。反之,若输入站点号或者配置选项号出错,则提示出错,并重新提示输入。

3) 当选择插入选项时,循环输出需要配置的选项,等待输入,并通过mysql_real_query()接口函数调用插入SQL语句,插入输入的配置值。全部配置项配置完成后,返回到主菜单项。

4) 当选择删除选项时,打印输出要删除的站点号,正确输入站点号后,通过mysql_real_query()接口函数调用删除SQL语句,删除相应的配置表,并返回主菜单。错误时,提醒出错,并重新删除操作。

5) 若选择退出,通过调用mysql_close()函数断开数据库连接。

3 基于Modbus协议的数据采集

3.1 Modbus协议介绍

Modbus通信采用主/从通信方式,主站点发出数据请求消息,从站点接收到正确的消息后就可以发送数据到主站点以响应请求;主站点也可以直接发送控制消息修改从站点的数据,实现双向读写。目前工业中将 Modbus通过以太网结合TCP/IP协议组成Modbus TCP/IP网络进行通信[3]。该Modbus帧格式如图4 所示。

图4 Modbus帧格式

Modbus帧在TCP/IP上传输的应用数据单元(ADU)包括供TCP/IP专用的Modbus应用协议报文头(MBAP)和通用的协议数据单元(PDU)组成[4]。整个Modbus帧的大小不能超过 256字节。该帧的具体含义:

事务处理标识符用来标识 Modbus 帧的顺序,每发送一个 Modbus 帧,该值加1;协议标识符用来表明应用层协议是不是 Modbus 协议,固定取值为0;长度用来表示单元标识符和数据域的字节数;单元标识符用来标识Modbus总线上所连接的从机设备的地址码;功能码指出了要求进行的操作;数据域具体格式与功能码密切相关,是一个可变长字段。总的说来,主站点发送请求数据时,数据域给出要操作的寄存器的起始地址和个数。而从站点发送应答数据时,数据域给出被操作的寄存器个数以及n个寄存器的状态值[5]。

3.2 数据采集实现

数据采集模块是采集系统的核心,为了提高数据采集的速度,该模块设计成多线程的结构,每个设备的采集都用一个线程来控制采集,这样在多核的Linux服务器上可以实现并发采集的功能。为了确保上传数据的完整性,在采集模块中引入了断线重连的机制。一旦建立的TCP/IP套接字发生断开情况,采集系统如果采集不到数据,就会马上刷新连接,重新建立TCP/IP套接字,继续发送采集请求。

为了更好便捷的操作,设计了一个modbus_info_t结构体,用来保存线程在采集过程中需要的信息,具体定义如下:

typedef struct _modbus_info {

modbus_t *md;

//modbus协议结构体

MYSQL *mysql;

// 保存数据库操作过程中用到的句柄

modbus_configure_t *modbus_configure_info;

//站点配置信息结构体

modbus_data_t *modbus_data;

//站点数据信息结构体

pthread_mutex_t rw_mutex;

//线程锁

int modbus_stat;

//状态标志

}modbus_info_t;

该结构体中的md成员是一个modbus_t结构体的指针变量,该结构体负责Modbus协议的相关操作,比如用于保存建立TCP/IP连接时套接字的成员表变量,用来协调实现Modbus的传输的一系列成员函数指针,以及用来保存传输过程中需要的数据等;mysql成员变量用于保存MySQL数据库操作过程中用到的句柄;modbus_configure_info成员保存了该线程所要采集的站点的配置信息;modbus_data成员则用来保存采集过后的数据信息,包括站点ID、地址、数据类型、数据值等;rw_mutex成员是线程间操作的互斥锁,用来实现各个线程之间访问公共数据的互斥操作;modbus_stat成员用来记录当前采集过程中的状态。

Modbus通信基于TCP/IP。首先,查看modbus_info结构体里面的modbus_stat变量,获取状态信息,如果处于未连接状态,则调用connect_site()函数进行TCP/IP连接,并更改状态为采集状态。当处于采集状态时,通过调用read_site_register()和read_site_bit()函数进行数据采集。若采集返回出错,则重新设置连接状态,等待下次循环重新建立连接并采集数据。当处于关闭状态是,通过调用close_site()函数关闭TCP/IP连接并释放相应的资源。同样需要重新设置连接状态。具体代码如下:

while(1){

switch(modbus_info->modbus_stat){

case 0:

if(-1!= connect_site(modbus_info))

//连接modbus设备

modbus_info->modbus_stat = 1;

break;

case 1:

if(-1==read_site_register(modbus_info,&modbus_mutex)‖-1== read_site_bit(modbus_info,&modbus_mutex))

//采集数据

modbus_info->modbus_stat=0;

break;

case 2:

close_site(modbus_info);

//断开modbus连接

modbus_info->modbus_stat=0;

break;}}

read_site_register()函数和read_site_bit()函数分别用来采集设备的寄存器值和线圈值,背后实现的过程大同小异。采集的状态通过函数值返回,若采集返回出错,则重新设置连接状态,等待下次循环重新建立连接并采集数据。采集的流程,如图5所示。

图5 Modbus数据采集流程图

Modbus协议规定报文帧的大小不能超过256字节,因此,每次采集的数目不能超过上限值。若传入的请求数量超过最大值时,则返回错误。若没有超过最大值,则根据传入的地址、数量、功能码等参数构造Modbus帧的各个字段,填充请求报文的头部。利用建立的TCP/IP连接把该Modbus帧数据发送至设备端。根据返回值判断是否发送成功,如果发送失败,则刷新Modbus连接,并重新发送。如果发送成功,则监听是否有数据到来。当发现有数据到来,同样利用TCP/IP连接接收Modbus帧数据。如果接收失败,说明TCP/IP链路出现问题,需要重新建立连接并返回错误码。如果接收成功,则检验接收到的数据是不是本次请求的所期望的数据。如果是,则提取接收到的Modbus帧的数据部分,并保存到内存中,如果不是,则返回错误码。

4 基于GPU的SM4并行加密

SM4 是一种分组密码算法,其分组长度和密钥长度均为128 bit。加解密算法与密钥扩张算法都采用32轮非线性迭代结构[6]。虽然利用SM4加密算法可以确保数据传输一定的安全。但是,由于SM4加密算法的公开性,密钥扩展算法与加密算法结构的相似性,轮密钥生成算法参数的固定,都导致其安全性降低。在数据量较大的情况下,使用SM4串行加密的耗时成为了采集系统实时传输的瓶颈。

4.1 改进SM4加密算法设计

本文中对SM4的特点设计出一种改进的SM4算法,提高了安全性,与传统算法相比改进之处主要体现在以下两点:

(1) 用AES-128密钥扩展算法替换SM4密钥扩展算法。

本文提出通过利用AES-128密钥扩展算法[9]生成SM4加密算法需要的32个轮密钥。新的密钥扩展算法,具有透明简洁、实现速度快、安全性高等优势。

(2) 将加解密算法中的32迭代所用轮函数由“固定函数”改为“动态选择”。

研究表明[8]将原轮函数:

Xi=4=F(Xi,Xi+1,Xi+2,Xi+3,rki)

=Xi⊕T(Xi+1⊕Xi+2⊕Xi+3⊕rki)

(1)

改为:

Xi=4=F(Xi,Xi+1,Xi+2,Xi+3,rki)

=Xi⊕T(Xi+1+Xi+2+Xi+3⊕rki)

(2)

将原算法中Xi+1,Xi+2,Xi+3的“⊕”运算替换为“+”运算是可行的、正确的、线性复杂度高,从而提高了整个算法的安全性。本文提出将32迭代所用轮函数由“固定函数”改为“动态选择”,即对每轮使用的轮函数在使用“⊕”还是 “+”运算时进行动态随机选择。改进后算法的轮函数如图6所示。

图6 基于动态选择的加密轮函数流程图

在对密码进行迭代之前以时间为随机种子,使用随机函数K(time)生成一个4字节32位的随机数G,G的每一位作为每一轮迭代时选择“⊕”还是“+”运算的轮函数。当G的某位为0选择使用Xi+4=F(Xi,Xi+1,Xi+2,Xi+3,rki)=Xi⊕T(Xi+1⊕Xi+2⊕Xi+3⊕rki)的轮函数,为1选择使用Xi+4=F(Xi,Xi+1,Xi+2,Xi+3,rki)=Xi⊕T(Xi+1+Xi+2+Xi+3+rki)的轮函数。

4.2 改进SM4并行加密算法实现

虽然动态SM4算法的安全性得到提高,但是数据加密耗时依然是采集系统传输实时性的瓶颈。本文利用GPU的并行计算能力与SM4算法的结构特点,设计了基于GPU的动态SM4并行数据加密模块。将采集到的实时数据送给GPU,GPU把加密后的结果送给数据转发模块,提高了加密运算的实时性。如图7所示。

图7 SM4并行算法整体框架

首先,在CPU执行一次密钥扩展,生成轮密钥。然后,将输入数据和扩展密钥存储到GPU全局存储空间内。在加密的初始阶段,输入数据将被分成每块128bit的数据分组,每个GPU线程负责加密一个数据分组。最后,加密输出的密文数据将再次被写到全局设备存储器内,随后,CPU程序将输出数据结果从GPU的全局设备存储器内取回,整个加密过程完成。

密钥扩展在CPU上执行一次,生成32组44字节的密钥分组,存储于全局存储区。cudaMalloc()函数是用来申请指定大小的GPU设备存储空间。cudaMemcpy()函数用来实现内存到GPU设备的数据的传递,第四个参数用来指定方向,cudaMemcpyHostToDevice表示从主机内存到GPU设备,cudaMemcpyDeviceToHost表示从GPU设备到主机内存[10,11]。具体代码如下:

unsigned char *d_sk;

//定义设备扩展密钥指针

sm4_setkey(sk, key);

//生成扩展密钥

cudaMalloc((void**)&d_sk, 128 * sizeof(unsigned char));

//分配设备扩展密钥空间

cudaMemcpy(d_sk, ctx.sk, 128 * sizeof(unsigned char), cudaMemcpyHostToDevice);

//复制密钥

将采集到的明文数据传入GPU全局存储空间内,供每个线程将会从该全局存储空间里提取自己需要处理的数据。同样,对于S盒Sbox的处理也是存储于全局存储区。具体代码如下:

unsigned char *d_input;

//定义明文指针

for(int i=0;i

cudaMalloc((void**)&d_input, size * sizeof(unsigned char));

//在设备上为明文分配空间

cudaMemcpy(d_input, input, size * sizeof(unsigned char), cudaMemcpyHostToDevice);

//将明文数据从主存传至设备

通过调用cryptKernel <<< dmgrid, 256 >>>(d_sk, d_input, d_output)核函数实现每个GPU线程对数据块的并行加密。其中d_sk表示扩展密钥,d_input表示明文,d_output表示加密后的密文。核函数提供对数据分组的加密处理,由多个块并行执行。具体代码如下:

__global__ void cryptKernel(unsigned long *d_sk, unsigned char *d_input, unsigned char *d_output)

{ int tid = threadIdx.x + blockDim.x * blockIdx.x;

//计算线程id号

unsigned char input[16],output[16];

unsigned long b, x[36];

memcpy(input,&d_input[tid *16],16);

//获取该线程要处理的数据

get_ulong(x[0],x[1],x[2],x[3],input);

//把16字节数据转换成44字节的形式

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

//循环

{b=sm4Sbox(x[i+1]^x[i+2]^x[i+3]^d_sk[i]);

//S盒变换

x[i+4] = x[i]^sm4L(b);}

//线性变换

put_ulong(x[35],x[34],x[33],x[32],output);

//输出密文数据

memcpy(&d_output[i*16],output,16);}

5 系统性能测试与分析

本文设计的独立于数据采集系统的配置应用程序,将站点配置和数据采集分开,可以很便捷地增加或删除站点,降低动态更改设备对数据采集系统的影响;另外,该配置应用程序操作简单、交互性强、具有容错能力,可以预防因误操作引起的数据采集系统的崩溃。

本文实现的断线重连机制,能够确保数据采集系统稳定性。为了测试该系统的断线重连机制,在运行该采集系统后,人为手动断开设备的网络连接,随机重新恢复网络连接,如此反复10次。通过查看日志文件,发现发生10次断线,自动重连10次,自动重连率100%。自动重连后系统依然运行正常,具有很好的断线重连功能,从而具有很好的稳定性。

加密算法的安全性,主要从扩散性[8]的角度对改进SM4的算法进行安全性测试分析。取100组明文数据,对每组明文改变任一比特时测试其密文比特改变个数,取其均值测试改进算法的扩散性。算法安全性指标的对比实验数据如表1所示,可见改进后的算法可达到很好的扩散效果,具有较好的安全性。

表1 动态SM4算法与原算法安全性比较

在采集数据量较大的情况下,使用SM4加密的耗时成为了实时传输的瓶颈。将基于GPU的并行SM4加密算法与传统的串行SM4加密算法进行实验对比,测试的数据长度从16 B到64 MB递增,每种大小的明文均运行100次,取平均值以减少数据误差,得到执行时间对比如图8所示。

图8 串行SM4和并行SM4执行时间比较

随着明文大小成倍增加,串行SM4的计算时间也成倍增加,但并行SM4的执行总时间以缓慢的速度增长,加速比高达40.6倍,说明在数据量较大的情况下,并行算法的耗时更少,加密的实时性更高。

6 结 语

在两台不同IP地址的主机上运行Modbus数据模拟器应用程序作为客户端,用来产生Modbus寄存器和线圈数据,如图9所示。运行本数据采集系统对其数据进行采集,通过数据显示模块,读取并显示采集到的数据,如图10所示。

图9 Modbus数据模拟器

图10 Modbus数据采集显示程序

本文实现了工业设备监控系统中最重要的数据采集子系统,典型应用在电厂设备和机房设备数据采集。数据采集采用与TCP/IP协议结合紧密的Modbus协议,方便数据的传输。将设备管理从数据采集系统分离出来,降低了动态更改设备对数据采集程序的影响,提高了管理设备的便捷性。该系统引入断线自动重连机制,提升了系统的稳定性。为了确保数据传输过程中的安全性,将实时数据进行加密后传输。为了提高安全性,对标准SM4加解算法进行了改进,提出改进的SM4算法。为了提升改进算法的加密、解密速度,提高数据传输的实时性,提出基于GPU并行计算的SM4加解密基本架构。最终,实现了对设备数据进行实时采集与加密传输的功能,为工业监控系统提供了核心模块。

[1] 国家商用密码管理办公室.国家密码管理局公告(第23号)[OL].(2012-02-21).http://www.oscca.gov.cn/News/201204/News_1227.htm.

[2] Hu Z, Liao X. SMS4 algorithm algebra fault attack[C]//2010 Third International Symposium on Electronic Commerce and Security (ISECS). IEEE, 2010:118-120.

[3] 张伟. 基于Modbus现场总线技术的智能配电系统设计与实现[D]. 南京:南京邮电大学, 2012.

[4] 高秀兰. 基于Modbus TCP/IP通讯综合监控系统的实现[J]. 仪表技术与传感器, 2015(10):104-106,110.

[5] 翁建年, 张浩, 彭道刚, 等. 基于嵌入式ARM的Modbus/TCP协议的研究与实现[J]. 计算机应用与软件, 2009, 26(10):36-38,68.

[6] Wang K, Peng D, Song L, et al. Implementation of Modbus communication protocol based on ARM Coretx-M0[C]//2014 IEEE International Conference on System Science and Engineering (ICSSE). IEEE, 2014:69-73.

[7] Wang S, Gu D, Liu J, et al. A power analysis on SMS4 using the chosen plaintext method[C]//2013 9th International Conference on Computational Intelligence and Security (CIS). IEEE, 2013:748-752.

[8] 郑秀林, 李敏. SMS4算法的一种改进[J]. 北京电子科技学院学报, 2007, 15(4):16-18.

[9] Harrison O, Waldron J. AES encryption implementation and analysis on commodity graphics processing units[C]//Proceedings of the 9th International Workshop on Cryptographic Hardware and Embedded Systems, 2007:209-226.

[10] Iwai K, Nishikawa N, Kurokawa T. Acceleration of AES encryption on CUDA GPU[J]. International Journal of Networking and Computing, 2012,2(1):131-145.

[11] Shane Cook. CUDA并行程序设计GPU编程指南[M]. 苏统华, 李东, 李松泽, 等, 译. 北京:机械工业出版社, 2014.

A DATA COLLECTION AND PARALLEL ENCRYPTION COMMUNICATION SYSTEMBASED ON MODBUS PROTOCOL

Huang Jian Zhang Hongmei Zhang Xiangli Cheng Da

(GuangxiCollegesandUniversitiesKeyLaboratoryofCloudComputingandComplexSystems,GUILINUniversityofElectronicTechnology,Guilin541004,Guangxi,China)

A data acquisition monitoring system based on Modbus is designed to monitor the running condition of industrial plant efficiently and centrally. The device management is separated from the data acquisition system in order to reduce the effects of dynamically changing equipment for data acquisition program and improve the convenience of equipment management. When this system is off line, it will be reconnected automatically, which improves its stability. Then, the advantages and disadvantages of traditional SM4 encryption algorithm are discussed and an improved SM4 encryption algorithm is proposed, which improves the security. Combining the structure characteristics of algorithm with the GPU parallel computing ability, an improved SM4 parallel data encryption algorithm based on GPU is designed. And the algorithm is applied to the data acquisition system, improving the real-time performance of data transmission.

Data acquisition SM4 Parallel computing

2015-10-19。国家自然科学

61461010,61363031);广西高校云计算与复杂系统重点实验研究课题(14101)。黄剑,硕士生,主研领域:信息安全,嵌入式应用系统。张红梅,教授。张向利,教授。陈达,硕士生。

TP309.2

A

10.3969/j.issn.1000-386x.2017.03.047

猜你喜欢

加密算法密钥站点
加密文档排序中保序加密算法的最优化选取
幻中邂逅之金色密钥
幻中邂逅之金色密钥
密码系统中密钥的状态与保护*
基于Web站点的SQL注入分析与防范
DES加密算法的实现
基于整数矩阵乘法的图像加密算法
TPM 2.0密钥迁移协议研究
积极开展远程教育示范站点评比活动
怕被人认出