黃 劍 張紅梅 張向利 陳 達(dá)
(桂林電子科技大學(xué)廣西高校云計(jì)算與復(fù)雜系統(tǒng)重點(diǎn)實(shí)驗(yàn)室 廣西 桂林 541004)
基于Modbus協(xié)議的數(shù)據(jù)采集與并行加密通信系統(tǒng)
黃 劍 張紅梅 張向利 陳 達(dá)
(桂林電子科技大學(xué)廣西高校云計(jì)算與復(fù)雜系統(tǒng)重點(diǎn)實(shí)驗(yàn)室 廣西 桂林 541004)
為了高效、集中地監(jiān)控工業(yè)設(shè)備的運(yùn)行情況,設(shè)計(jì)了基于Modbus的數(shù)據(jù)采集監(jiān)控系統(tǒng)。提出將設(shè)備管理從數(shù)據(jù)采集系統(tǒng)分離出來,降低動(dòng)態(tài)更改設(shè)備對(duì)數(shù)據(jù)采集系統(tǒng)的影響,提高設(shè)備管理的便捷性。該系統(tǒng)引入斷線自動(dòng)重連機(jī)制,提升了系統(tǒng)的穩(wěn)定性。探討傳統(tǒng)SM4加密算法的優(yōu)缺點(diǎn),提出改進(jìn)的SM4加密算法,提高了安全性。結(jié)合算法的結(jié)構(gòu)特點(diǎn)與GPU的并行計(jì)算能力,設(shè)計(jì)了基于GPU的SM4并行數(shù)據(jù)加密算法,并將該算法應(yīng)用到數(shù)據(jù)采集系統(tǒng)中,提高了數(shù)據(jù)傳輸過程中的實(shí)時(shí)性。
數(shù)據(jù)采集 SM4 并行計(jì)算
隨著物聯(lián)網(wǎng)的發(fā)展,越來越多的企業(yè)需要將生產(chǎn)及運(yùn)營的設(shè)備接入網(wǎng)絡(luò)并對(duì)其進(jìn)行遠(yuǎn)程實(shí)時(shí)監(jiān)控,大量的設(shè)備監(jiān)控?cái)?shù)據(jù)往往需要通過互聯(lián)網(wǎng)傳輸?shù)竭h(yuǎn)處的監(jiān)控中心。但是,由于互聯(lián)網(wǎng)的開放性,一旦監(jiān)控?cái)?shù)據(jù)被截獲并被用于破壞活動(dòng),其帶來的損失將會(huì)非常嚴(yán)重。因此,工業(yè)數(shù)據(jù)傳輸?shù)陌踩詥栴}亟待解決。此外,隨著設(shè)備數(shù)量的增加。數(shù)據(jù)量的增加,如何確保數(shù)據(jù)傳輸實(shí)時(shí)性、采集系統(tǒng)的穩(wěn)定性和設(shè)備管理的便捷性也將成為一個(gè)難題。
基于以上問題,本文提出了基于Modbus的數(shù)據(jù)采集與并行加密通信系統(tǒng)。將設(shè)備管理從數(shù)據(jù)采集系統(tǒng)分離出來,降低了動(dòng)態(tài)更改設(shè)備對(duì)數(shù)據(jù)采集程序的影響,提高了管理設(shè)備的便捷性。該系統(tǒng)引入斷線自動(dòng)重連機(jī)制,提升了系統(tǒng)的穩(wěn)定性。雖然,利用SM4加密算法[1]可以確保數(shù)據(jù)傳輸一定的安全,但是,由于SM4密鑰擴(kuò)展算法與加密算法結(jié)構(gòu)相似性,輪密鑰生成算法參數(shù)的固定,都導(dǎo)致其安全性降低[2]。本文提出改進(jìn)的SM4加密算法,并結(jié)合算法的結(jié)構(gòu)特點(diǎn)與GPU的并行計(jì)算能力,設(shè)計(jì)了基于GPU的SM4并行數(shù)據(jù)加密算法,提高了數(shù)據(jù)傳輸過程中的安全性和實(shí)時(shí)性。
設(shè)備數(shù)據(jù)監(jiān)控系統(tǒng)采用分布式架構(gòu),分為中心控制系統(tǒng)、采集控制系統(tǒng)和通信系統(tǒng)等3個(gè)主要部分,如圖1所示。
圖1 設(shè)備數(shù)據(jù)監(jiān)控系統(tǒng)架構(gòu)圖
中心控制系統(tǒng)實(shí)現(xiàn)對(duì)下屬子區(qū)域各個(gè)設(shè)備的監(jiān)控功能,采集控制系統(tǒng)實(shí)現(xiàn)對(duì)設(shè)備數(shù)據(jù)信息的采集及對(duì)采集到的數(shù)據(jù)進(jìn)行加密轉(zhuǎn)發(fā)功能,通信系統(tǒng)實(shí)現(xiàn)在中心控制系統(tǒng)與采集控制系統(tǒng)的通信。為保證監(jiān)控系統(tǒng)的可靠性,系統(tǒng)需要全天24小時(shí)不間斷地運(yùn)行并傳輸著大量實(shí)時(shí)數(shù)據(jù)。因此,對(duì)數(shù)據(jù)傳輸過程的實(shí)時(shí)性、穩(wěn)定性和安全性要求都非常高。隨著業(yè)務(wù)的增加,設(shè)備的增加,對(duì)設(shè)備的動(dòng)態(tài)管理提出了更高的要求。
采集控制系統(tǒng)是整個(gè)系統(tǒng)的核心,其系統(tǒng)組成示意如圖2所示,系統(tǒng)主要包括主應(yīng)用程序、數(shù)據(jù)采集模塊、控制模塊、數(shù)據(jù)加解密模塊、數(shù)據(jù)轉(zhuǎn)發(fā)與存儲(chǔ)顯示模塊、站點(diǎn)配置模塊,以及Modbus協(xié)議、TCP/IP協(xié)議和MySQL數(shù)據(jù)庫。
圖2 數(shù)據(jù)采集系統(tǒng)示意圖
由于采集的站點(diǎn)數(shù)據(jù)信息量大,不適宜用單線程實(shí)現(xiàn)各個(gè)功能,因此采取多線程機(jī)制,把整個(gè)工作細(xì)化為若干個(gè)獨(dú)立的模塊,在多核的服務(wù)器上實(shí)現(xiàn)多線程并發(fā)操作,減少每次的采集時(shí)間。
當(dāng)設(shè)備數(shù)量達(dá)到一定規(guī)模后,設(shè)備的配置信息的管理成為一個(gè)急需解決的問題。使用配置文件或程序中指定的方法不具有良好的交互性和易操作性。本文提出基于MySQL數(shù)據(jù)庫的配置應(yīng)用程序,根據(jù)實(shí)際的需求,產(chǎn)生配置信息表,存儲(chǔ)在數(shù)據(jù)庫中。將站點(diǎn)配置和數(shù)據(jù)采集分開,可以很方便地增加或刪除站點(diǎn),擴(kuò)展性強(qiáng)、便捷性好。另外,該配置應(yīng)用程序操作簡單、交互性強(qiáng)、具有容錯(cuò)能力,可以預(yù)防因誤操作引起的數(shù)據(jù)采集系統(tǒng)的崩潰。
數(shù)據(jù)采集應(yīng)用程序根據(jù)配置表信息,創(chuàng)建并協(xié)調(diào)各個(gè)線程。數(shù)據(jù)采集模塊根據(jù)主應(yīng)用程序的采集信息,填充Modbus協(xié)議的各個(gè)字段,并組裝成TCP/IP幀,發(fā)送出采集請求命令。該模塊還從接收到的TCP/IP幀中提取出采集到的數(shù)據(jù)。該模塊引入斷線自動(dòng)重連的機(jī)制。一旦建立的鏈接發(fā)生斷開情況,就會(huì)立刻刷新并重新建立鏈接,繼續(xù)發(fā)送采集請求,提高系統(tǒng)的穩(wěn)定性。
為了提升數(shù)據(jù)在互聯(lián)網(wǎng)上傳輸?shù)陌踩?,在?shù)據(jù)發(fā)送前采用改進(jìn)的SM4加密算法對(duì)數(shù)據(jù)進(jìn)行加密。在數(shù)據(jù)量較大的情況下,數(shù)據(jù)加密的耗時(shí)成為了實(shí)時(shí)傳輸?shù)钠款i。本文利用GPU的并行計(jì)算能力,設(shè)計(jì)了基于GPU的并行加解密模塊。將數(shù)據(jù)采集過來的實(shí)時(shí)數(shù)據(jù)送給GPU,GPU把加密后的結(jié)果送給數(shù)據(jù)轉(zhuǎn)發(fā)模塊。數(shù)據(jù)轉(zhuǎn)發(fā)模塊負(fù)責(zé)把采集到的數(shù)據(jù)利用TCP/IP轉(zhuǎn)發(fā)出去。數(shù)據(jù)存儲(chǔ)模塊負(fù)責(zé)把采集到的實(shí)時(shí)數(shù)據(jù)存儲(chǔ)到數(shù)據(jù)庫中。
為了方便管理大規(guī)模站點(diǎn)設(shè)備的信息,并且各個(gè)站點(diǎn)的配置信息往往是隨需求而改變的,因此單獨(dú)設(shè)計(jì)了一個(gè)基于MySQL數(shù)據(jù)庫的配置應(yīng)用程序,如圖3所示,可以便捷、靈活、直觀地管理各個(gè)設(shè)備。站點(diǎn)的配置信息主要包括設(shè)備的IP地址、端口號(hào)、起始地址、采集數(shù)量等。
圖3 站點(diǎn)配置管理應(yīng)用程序
首先,通過調(diào)用MySQL數(shù)據(jù)庫的接口mysql_real_connect()函數(shù)連接modbus_db數(shù)據(jù)庫,若返回調(diào)用失敗,說明還沒有該modbus_db數(shù)據(jù)庫,則調(diào)用mysql_real_query()函數(shù)創(chuàng)建modbus_db數(shù)據(jù)庫和modbus_configure_table配置表,并初始化配置表的各個(gè)字段。
然后,打印顯示菜單欄,提示用戶功能選項(xiàng)(配置、插入、更改、刪除、退出),并等待用戶輸入。
1) 當(dāng)選擇查看配置時(shí),通過mysql_real_query()函數(shù)調(diào)用查詢SQL語句,把當(dāng)前所有的配置表信息打印出來。
2) 當(dāng)選擇更改配置時(shí),提示用戶選擇需要更改的站點(diǎn)號(hào),當(dāng)正確輸入站點(diǎn)號(hào)之后,打印當(dāng)前的配置信息,并等待用戶輸入需要修改的配置項(xiàng)。正確輸入需要修改的選項(xiàng)后,提示輸入新的配置值,并通過mysql_real_query()接口函數(shù)調(diào)用更改SQL語句,更改配置為當(dāng)前的輸入值。若沒有需要修改的項(xiàng)了,則輸入q退出,返回主菜單欄。反之,若輸入站點(diǎn)號(hào)或者配置選項(xiàng)號(hào)出錯(cuò),則提示出錯(cuò),并重新提示輸入。
3) 當(dāng)選擇插入選項(xiàng)時(shí),循環(huán)輸出需要配置的選項(xiàng),等待輸入,并通過mysql_real_query()接口函數(shù)調(diào)用插入SQL語句,插入輸入的配置值。全部配置項(xiàng)配置完成后,返回到主菜單項(xiàng)。
4) 當(dāng)選擇刪除選項(xiàng)時(shí),打印輸出要?jiǎng)h除的站點(diǎn)號(hào),正確輸入站點(diǎn)號(hào)后,通過mysql_real_query()接口函數(shù)調(diào)用刪除SQL語句,刪除相應(yīng)的配置表,并返回主菜單。錯(cuò)誤時(shí),提醒出錯(cuò),并重新刪除操作。
5) 若選擇退出,通過調(diào)用mysql_close()函數(shù)斷開數(shù)據(jù)庫連接。
3.1 Modbus協(xié)議介紹
Modbus通信采用主/從通信方式,主站點(diǎn)發(fā)出數(shù)據(jù)請求消息,從站點(diǎn)接收到正確的消息后就可以發(fā)送數(shù)據(jù)到主站點(diǎn)以響應(yīng)請求;主站點(diǎn)也可以直接發(fā)送控制消息修改從站點(diǎn)的數(shù)據(jù),實(shí)現(xiàn)雙向讀寫。目前工業(yè)中將 Modbus通過以太網(wǎng)結(jié)合TCP/IP協(xié)議組成Modbus TCP/IP網(wǎng)絡(luò)進(jìn)行通信[3]。該Modbus幀格式如圖4 所示。
圖4 Modbus幀格式
Modbus幀在TCP/IP上傳輸?shù)膽?yīng)用數(shù)據(jù)單元(ADU)包括供TCP/IP專用的Modbus應(yīng)用協(xié)議報(bào)文頭(MBAP)和通用的協(xié)議數(shù)據(jù)單元(PDU)組成[4]。整個(gè)Modbus幀的大小不能超過 256字節(jié)。該幀的具體含義:
事務(wù)處理標(biāo)識(shí)符用來標(biāo)識(shí) Modbus 幀的順序,每發(fā)送一個(gè) Modbus 幀,該值加1;協(xié)議標(biāo)識(shí)符用來表明應(yīng)用層協(xié)議是不是 Modbus 協(xié)議,固定取值為0;長度用來表示單元標(biāo)識(shí)符和數(shù)據(jù)域的字節(jié)數(shù);單元標(biāo)識(shí)符用來標(biāo)識(shí)Modbus總線上所連接的從機(jī)設(shè)備的地址碼;功能碼指出了要求進(jìn)行的操作;數(shù)據(jù)域具體格式與功能碼密切相關(guān),是一個(gè)可變長字段??偟恼f來,主站點(diǎn)發(fā)送請求數(shù)據(jù)時(shí),數(shù)據(jù)域給出要操作的寄存器的起始地址和個(gè)數(shù)。而從站點(diǎn)發(fā)送應(yīng)答數(shù)據(jù)時(shí),數(shù)據(jù)域給出被操作的寄存器個(gè)數(shù)以及n個(gè)寄存器的狀態(tài)值[5]。
3.2 數(shù)據(jù)采集實(shí)現(xiàn)
數(shù)據(jù)采集模塊是采集系統(tǒng)的核心,為了提高數(shù)據(jù)采集的速度,該模塊設(shè)計(jì)成多線程的結(jié)構(gòu),每個(gè)設(shè)備的采集都用一個(gè)線程來控制采集,這樣在多核的Linux服務(wù)器上可以實(shí)現(xiàn)并發(fā)采集的功能。為了確保上傳數(shù)據(jù)的完整性,在采集模塊中引入了斷線重連的機(jī)制。一旦建立的TCP/IP套接字發(fā)生斷開情況,采集系統(tǒng)如果采集不到數(shù)據(jù),就會(huì)馬上刷新連接,重新建立TCP/IP套接字,繼續(xù)發(fā)送采集請求。
為了更好便捷的操作,設(shè)計(jì)了一個(gè)modbus_info_t結(jié)構(gòu)體,用來保存線程在采集過程中需要的信息,具體定義如下:
typedef struct _modbus_info {
modbus_t *md;
//modbus協(xié)議結(jié)構(gòu)體
MYSQL *mysql;
// 保存數(shù)據(jù)庫操作過程中用到的句柄
modbus_configure_t *modbus_configure_info;
//站點(diǎn)配置信息結(jié)構(gòu)體
modbus_data_t *modbus_data;
//站點(diǎn)數(shù)據(jù)信息結(jié)構(gòu)體
pthread_mutex_t rw_mutex;
//線程鎖
int modbus_stat;
//狀態(tài)標(biāo)志
}modbus_info_t;
該結(jié)構(gòu)體中的md成員是一個(gè)modbus_t結(jié)構(gòu)體的指針變量,該結(jié)構(gòu)體負(fù)責(zé)Modbus協(xié)議的相關(guān)操作,比如用于保存建立TCP/IP連接時(shí)套接字的成員表變量,用來協(xié)調(diào)實(shí)現(xiàn)Modbus的傳輸?shù)囊幌盗谐蓡T函數(shù)指針,以及用來保存?zhèn)鬏斶^程中需要的數(shù)據(jù)等;mysql成員變量用于保存MySQL數(shù)據(jù)庫操作過程中用到的句柄;modbus_configure_info成員保存了該線程所要采集的站點(diǎn)的配置信息;modbus_data成員則用來保存采集過后的數(shù)據(jù)信息,包括站點(diǎn)ID、地址、數(shù)據(jù)類型、數(shù)據(jù)值等;rw_mutex成員是線程間操作的互斥鎖,用來實(shí)現(xiàn)各個(gè)線程之間訪問公共數(shù)據(jù)的互斥操作;modbus_stat成員用來記錄當(dāng)前采集過程中的狀態(tài)。
Modbus通信基于TCP/IP。首先,查看modbus_info結(jié)構(gòu)體里面的modbus_stat變量,獲取狀態(tài)信息,如果處于未連接狀態(tài),則調(diào)用connect_site()函數(shù)進(jìn)行TCP/IP連接,并更改狀態(tài)為采集狀態(tài)。當(dāng)處于采集狀態(tài)時(shí),通過調(diào)用read_site_register()和read_site_bit()函數(shù)進(jìn)行數(shù)據(jù)采集。若采集返回出錯(cuò),則重新設(shè)置連接狀態(tài),等待下次循環(huán)重新建立連接并采集數(shù)據(jù)。當(dāng)處于關(guān)閉狀態(tài)是,通過調(diào)用close_site()函數(shù)關(guān)閉TCP/IP連接并釋放相應(yīng)的資源。同樣需要重新設(shè)置連接狀態(tài)。具體代碼如下:
while(1){
switch(modbus_info->modbus_stat){
case 0:
if(-1!= connect_site(modbus_info))
//連接modbus設(shè)備
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))
//采集數(shù)據(jù)
modbus_info->modbus_stat=0;
break;
case 2:
close_site(modbus_info);
//斷開modbus連接
modbus_info->modbus_stat=0;
break;}}
read_site_register()函數(shù)和read_site_bit()函數(shù)分別用來采集設(shè)備的寄存器值和線圈值,背后實(shí)現(xiàn)的過程大同小異。采集的狀態(tài)通過函數(shù)值返回,若采集返回出錯(cuò),則重新設(shè)置連接狀態(tài),等待下次循環(huán)重新建立連接并采集數(shù)據(jù)。采集的流程,如圖5所示。
圖5 Modbus數(shù)據(jù)采集流程圖
Modbus協(xié)議規(guī)定報(bào)文幀的大小不能超過256字節(jié),因此,每次采集的數(shù)目不能超過上限值。若傳入的請求數(shù)量超過最大值時(shí),則返回錯(cuò)誤。若沒有超過最大值,則根據(jù)傳入的地址、數(shù)量、功能碼等參數(shù)構(gòu)造Modbus幀的各個(gè)字段,填充請求報(bào)文的頭部。利用建立的TCP/IP連接把該Modbus幀數(shù)據(jù)發(fā)送至設(shè)備端。根據(jù)返回值判斷是否發(fā)送成功,如果發(fā)送失敗,則刷新Modbus連接,并重新發(fā)送。如果發(fā)送成功,則監(jiān)聽是否有數(shù)據(jù)到來。當(dāng)發(fā)現(xiàn)有數(shù)據(jù)到來,同樣利用TCP/IP連接接收Modbus幀數(shù)據(jù)。如果接收失敗,說明TCP/IP鏈路出現(xiàn)問題,需要重新建立連接并返回錯(cuò)誤碼。如果接收成功,則檢驗(yàn)接收到的數(shù)據(jù)是不是本次請求的所期望的數(shù)據(jù)。如果是,則提取接收到的Modbus幀的數(shù)據(jù)部分,并保存到內(nèi)存中,如果不是,則返回錯(cuò)誤碼。
SM4 是一種分組密碼算法,其分組長度和密鑰長度均為128 bit。加解密算法與密鑰擴(kuò)張算法都采用32輪非線性迭代結(jié)構(gòu)[6]。雖然利用SM4加密算法可以確保數(shù)據(jù)傳輸一定的安全。但是,由于SM4加密算法的公開性,密鑰擴(kuò)展算法與加密算法結(jié)構(gòu)的相似性,輪密鑰生成算法參數(shù)的固定,都導(dǎo)致其安全性降低。在數(shù)據(jù)量較大的情況下,使用SM4串行加密的耗時(shí)成為了采集系統(tǒng)實(shí)時(shí)傳輸?shù)钠款i。
4.1 改進(jìn)SM4加密算法設(shè)計(jì)
本文中對(duì)SM4的特點(diǎn)設(shè)計(jì)出一種改進(jìn)的SM4算法,提高了安全性,與傳統(tǒng)算法相比改進(jìn)之處主要體現(xiàn)在以下兩點(diǎn):
(1) 用AES-128密鑰擴(kuò)展算法替換SM4密鑰擴(kuò)展算法。
本文提出通過利用AES-128密鑰擴(kuò)展算法[9]生成SM4加密算法需要的32個(gè)輪密鑰。新的密鑰擴(kuò)展算法,具有透明簡潔、實(shí)現(xiàn)速度快、安全性高等優(yōu)勢。
(2) 將加解密算法中的32迭代所用輪函數(shù)由“固定函數(shù)”改為“動(dòng)態(tài)選擇”。
研究表明[8]將原輪函數(shù):
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的“⊕”運(yùn)算替換為“+”運(yùn)算是可行的、正確的、線性復(fù)雜度高,從而提高了整個(gè)算法的安全性。本文提出將32迭代所用輪函數(shù)由“固定函數(shù)”改為“動(dòng)態(tài)選擇”,即對(duì)每輪使用的輪函數(shù)在使用“⊕”還是 “+”運(yùn)算時(shí)進(jìn)行動(dòng)態(tài)隨機(jī)選擇。改進(jìn)后算法的輪函數(shù)如圖6所示。
圖6 基于動(dòng)態(tài)選擇的加密輪函數(shù)流程圖
在對(duì)密碼進(jìn)行迭代之前以時(shí)間為隨機(jī)種子,使用隨機(jī)函數(shù)K(time)生成一個(gè)4字節(jié)32位的隨機(jī)數(shù)G,G的每一位作為每一輪迭代時(shí)選擇“⊕”還是“+”運(yùn)算的輪函數(shù)。當(dāng)G的某位為0選擇使用Xi+4=F(Xi,Xi+1,Xi+2,Xi+3,rki)=Xi⊕T(Xi+1⊕Xi+2⊕Xi+3⊕rki)的輪函數(shù),為1選擇使用Xi+4=F(Xi,Xi+1,Xi+2,Xi+3,rki)=Xi⊕T(Xi+1+Xi+2+Xi+3+rki)的輪函數(shù)。
4.2 改進(jìn)SM4并行加密算法實(shí)現(xiàn)
雖然動(dòng)態(tài)SM4算法的安全性得到提高,但是數(shù)據(jù)加密耗時(shí)依然是采集系統(tǒng)傳輸實(shí)時(shí)性的瓶頸。本文利用GPU的并行計(jì)算能力與SM4算法的結(jié)構(gòu)特點(diǎn),設(shè)計(jì)了基于GPU的動(dòng)態(tài)SM4并行數(shù)據(jù)加密模塊。將采集到的實(shí)時(shí)數(shù)據(jù)送給GPU,GPU把加密后的結(jié)果送給數(shù)據(jù)轉(zhuǎn)發(fā)模塊,提高了加密運(yùn)算的實(shí)時(shí)性。如圖7所示。
圖7 SM4并行算法整體框架
首先,在CPU執(zhí)行一次密鑰擴(kuò)展,生成輪密鑰。然后,將輸入數(shù)據(jù)和擴(kuò)展密鑰存儲(chǔ)到GPU全局存儲(chǔ)空間內(nèi)。在加密的初始階段,輸入數(shù)據(jù)將被分成每塊128bit的數(shù)據(jù)分組,每個(gè)GPU線程負(fù)責(zé)加密一個(gè)數(shù)據(jù)分組。最后,加密輸出的密文數(shù)據(jù)將再次被寫到全局設(shè)備存儲(chǔ)器內(nèi),隨后,CPU程序?qū)⑤敵鰯?shù)據(jù)結(jié)果從GPU的全局設(shè)備存儲(chǔ)器內(nèi)取回,整個(gè)加密過程完成。
密鑰擴(kuò)展在CPU上執(zhí)行一次,生成32組44字節(jié)的密鑰分組,存儲(chǔ)于全局存儲(chǔ)區(qū)。cudaMalloc()函數(shù)是用來申請指定大小的GPU設(shè)備存儲(chǔ)空間。cudaMemcpy()函數(shù)用來實(shí)現(xiàn)內(nèi)存到GPU設(shè)備的數(shù)據(jù)的傳遞,第四個(gè)參數(shù)用來指定方向,cudaMemcpyHostToDevice表示從主機(jī)內(nèi)存到GPU設(shè)備,cudaMemcpyDeviceToHost表示從GPU設(shè)備到主機(jī)內(nèi)存[10,11]。具體代碼如下:
unsigned char *d_sk;
//定義設(shè)備擴(kuò)展密鑰指針
sm4_setkey(sk, key);
//生成擴(kuò)展密鑰
cudaMalloc((void**)&d_sk, 128 * sizeof(unsigned char));
//分配設(shè)備擴(kuò)展密鑰空間
cudaMemcpy(d_sk, ctx.sk, 128 * sizeof(unsigned char), cudaMemcpyHostToDevice);
//復(fù)制密鑰
將采集到的明文數(shù)據(jù)傳入GPU全局存儲(chǔ)空間內(nèi),供每個(gè)線程將會(huì)從該全局存儲(chǔ)空間里提取自己需要處理的數(shù)據(jù)。同樣,對(duì)于S盒Sbox的處理也是存儲(chǔ)于全局存儲(chǔ)區(qū)。具體代碼如下:
unsigned char *d_input;
//定義明文指針
for(int i=0;i cudaMalloc((void**)&d_input, size * sizeof(unsigned char)); //在設(shè)備上為明文分配空間 cudaMemcpy(d_input, input, size * sizeof(unsigned char), cudaMemcpyHostToDevice); //將明文數(shù)據(jù)從主存?zhèn)髦猎O(shè)備 通過調(diào)用cryptKernel <<< dmgrid, 256 >>>(d_sk, d_input, d_output)核函數(shù)實(shí)現(xiàn)每個(gè)GPU線程對(duì)數(shù)據(jù)塊的并行加密。其中d_sk表示擴(kuò)展密鑰,d_input表示明文,d_output表示加密后的密文。核函數(shù)提供對(duì)數(shù)據(jù)分組的加密處理,由多個(gè)塊并行執(zhí)行。具體代碼如下: __global__ void cryptKernel(unsigned long *d_sk, unsigned char *d_input, unsigned char *d_output) { int tid = threadIdx.x + blockDim.x * blockIdx.x; //計(jì)算線程id號(hào) unsigned char input[16],output[16]; unsigned long b, x[36]; memcpy(input,&d_input[tid *16],16); //獲取該線程要處理的數(shù)據(jù) get_ulong(x[0],x[1],x[2],x[3],input); //把16字節(jié)數(shù)據(jù)轉(zhuǎn)換成44字節(jié)的形式 for(int i=0;i<32;i++) //循環(huán) {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); //輸出密文數(shù)據(jù) memcpy(&d_output[i*16],output,16);} 本文設(shè)計(jì)的獨(dú)立于數(shù)據(jù)采集系統(tǒng)的配置應(yīng)用程序,將站點(diǎn)配置和數(shù)據(jù)采集分開,可以很便捷地增加或刪除站點(diǎn),降低動(dòng)態(tài)更改設(shè)備對(duì)數(shù)據(jù)采集系統(tǒng)的影響;另外,該配置應(yīng)用程序操作簡單、交互性強(qiáng)、具有容錯(cuò)能力,可以預(yù)防因誤操作引起的數(shù)據(jù)采集系統(tǒng)的崩潰。 本文實(shí)現(xiàn)的斷線重連機(jī)制,能夠確保數(shù)據(jù)采集系統(tǒng)穩(wěn)定性。為了測試該系統(tǒng)的斷線重連機(jī)制,在運(yùn)行該采集系統(tǒng)后,人為手動(dòng)斷開設(shè)備的網(wǎng)絡(luò)連接,隨機(jī)重新恢復(fù)網(wǎng)絡(luò)連接,如此反復(fù)10次。通過查看日志文件,發(fā)現(xiàn)發(fā)生10次斷線,自動(dòng)重連10次,自動(dòng)重連率100%。自動(dòng)重連后系統(tǒng)依然運(yùn)行正常,具有很好的斷線重連功能,從而具有很好的穩(wěn)定性。 加密算法的安全性,主要從擴(kuò)散性[8]的角度對(duì)改進(jìn)SM4的算法進(jìn)行安全性測試分析。取100組明文數(shù)據(jù),對(duì)每組明文改變?nèi)我槐忍貢r(shí)測試其密文比特改變個(gè)數(shù),取其均值測試改進(jìn)算法的擴(kuò)散性。算法安全性指標(biāo)的對(duì)比實(shí)驗(yàn)數(shù)據(jù)如表1所示,可見改進(jìn)后的算法可達(dá)到很好的擴(kuò)散效果,具有較好的安全性。 表1 動(dòng)態(tài)SM4算法與原算法安全性比較 在采集數(shù)據(jù)量較大的情況下,使用SM4加密的耗時(shí)成為了實(shí)時(shí)傳輸?shù)钠款i。將基于GPU的并行SM4加密算法與傳統(tǒng)的串行SM4加密算法進(jìn)行實(shí)驗(yàn)對(duì)比,測試的數(shù)據(jù)長度從16 B到64 MB遞增,每種大小的明文均運(yùn)行100次,取平均值以減少數(shù)據(jù)誤差,得到執(zhí)行時(shí)間對(duì)比如圖8所示。 圖8 串行SM4和并行SM4執(zhí)行時(shí)間比較 隨著明文大小成倍增加,串行SM4的計(jì)算時(shí)間也成倍增加,但并行SM4的執(zhí)行總時(shí)間以緩慢的速度增長,加速比高達(dá)40.6倍,說明在數(shù)據(jù)量較大的情況下,并行算法的耗時(shí)更少,加密的實(shí)時(shí)性更高。 在兩臺(tái)不同IP地址的主機(jī)上運(yùn)行Modbus數(shù)據(jù)模擬器應(yīng)用程序作為客戶端,用來產(chǎn)生Modbus寄存器和線圈數(shù)據(jù),如圖9所示。運(yùn)行本數(shù)據(jù)采集系統(tǒng)對(duì)其數(shù)據(jù)進(jìn)行采集,通過數(shù)據(jù)顯示模塊,讀取并顯示采集到的數(shù)據(jù),如圖10所示。 圖9 Modbus數(shù)據(jù)模擬器 圖10 Modbus數(shù)據(jù)采集顯示程序 本文實(shí)現(xiàn)了工業(yè)設(shè)備監(jiān)控系統(tǒng)中最重要的數(shù)據(jù)采集子系統(tǒng),典型應(yīng)用在電廠設(shè)備和機(jī)房設(shè)備數(shù)據(jù)采集。數(shù)據(jù)采集采用與TCP/IP協(xié)議結(jié)合緊密的Modbus協(xié)議,方便數(shù)據(jù)的傳輸。將設(shè)備管理從數(shù)據(jù)采集系統(tǒng)分離出來,降低了動(dòng)態(tài)更改設(shè)備對(duì)數(shù)據(jù)采集程序的影響,提高了管理設(shè)備的便捷性。該系統(tǒng)引入斷線自動(dòng)重連機(jī)制,提升了系統(tǒng)的穩(wěn)定性。為了確保數(shù)據(jù)傳輸過程中的安全性,將實(shí)時(shí)數(shù)據(jù)進(jìn)行加密后傳輸。為了提高安全性,對(duì)標(biāo)準(zhǔn)SM4加解算法進(jìn)行了改進(jìn),提出改進(jìn)的SM4算法。為了提升改進(jìn)算法的加密、解密速度,提高數(shù)據(jù)傳輸?shù)膶?shí)時(shí)性,提出基于GPU并行計(jì)算的SM4加解密基本架構(gòu)。最終,實(shí)現(xiàn)了對(duì)設(shè)備數(shù)據(jù)進(jìn)行實(shí)時(shí)采集與加密傳輸?shù)墓δ埽瑸楣I(yè)監(jiān)控系統(tǒng)提供了核心模塊。 [1] 國家商用密碼管理辦公室.國家密碼管理局公告(第23號(hào))[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現(xiàn)場總線技術(shù)的智能配電系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)[D]. 南京:南京郵電大學(xué), 2012. [4] 高秀蘭. 基于Modbus TCP/IP通訊綜合監(jiān)控系統(tǒng)的實(shí)現(xiàn)[J]. 儀表技術(shù)與傳感器, 2015(10):104-106,110. [5] 翁建年, 張浩, 彭道剛, 等. 基于嵌入式ARM的Modbus/TCP協(xié)議的研究與實(shí)現(xiàn)[J]. 計(jì)算機(jī)應(yīng)用與軟件, 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ìn)[J]. 北京電子科技學(xué)院學(xué)報(bào), 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并行程序設(shè)計(jì)GPU編程指南[M]. 蘇統(tǒng)華, 李東, 李松澤, 等, 譯. 北京:機(jī)械工業(yè)出版社, 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。國家自然科學(xué) 61461010,61363031);廣西高校云計(jì)算與復(fù)雜系統(tǒng)重點(diǎn)實(shí)驗(yàn)研究課題(14101)。黃劍,碩士生,主研領(lǐng)域:信息安全,嵌入式應(yīng)用系統(tǒng)。張紅梅,教授。張向利,教授。陳達(dá),碩士生。 TP309.2 A 10.3969/j.issn.1000-386x.2017.03.0475 系統(tǒng)性能測試與分析
6 結(jié) 語