是,則返回錯(cuò)誤碼。
[0150] 步驟3.3、當(dāng)狀態(tài)變量處于關(guān)閉狀態(tài)是,通過(guò)調(diào)用關(guān)閉函數(shù)關(guān)閉TCP/IP連接并釋放 相應(yīng)的資源,結(jié)束本次數(shù)據(jù)采集。
[0151] 步驟3.4、重復(fù)上述3.1-3.3的步驟,獲得各個(gè)站點(diǎn)的明文數(shù)據(jù),并保存到全局緩沖 區(qū)中。
[0152]三、數(shù)據(jù)加解密傳輸階段
[0153] 當(dāng)采集過(guò)來(lái)的數(shù)據(jù)通過(guò)互聯(lián)網(wǎng)向中心監(jiān)控系統(tǒng)傳輸時(shí),監(jiān)控系統(tǒng)的體系結(jié)構(gòu)就逐 漸由封閉轉(zhuǎn)向開放,容易遭到攻擊。本發(fā)明設(shè)計(jì)了基于改進(jìn)SM4的加密算法,對(duì)采集來(lái)的 Modbus數(shù)據(jù)進(jìn)行加密。在數(shù)據(jù)量較大的情況下,數(shù)據(jù)加密的耗時(shí)成為了實(shí)時(shí)傳輸?shù)钠款i。本 文利用GHJ的并行計(jì)算能力,設(shè)計(jì)了基于GPU的改進(jìn)SM4并行加解密模塊。該模塊將數(shù)據(jù)采集 過(guò)來(lái)的實(shí)時(shí)數(shù)據(jù)送給GPU進(jìn)行加密,GPU把加密后的結(jié)果送給數(shù)據(jù)轉(zhuǎn)發(fā)模塊。數(shù)據(jù)存儲(chǔ)模塊 負(fù)責(zé)把采集到的實(shí)時(shí)數(shù)據(jù)存儲(chǔ)到數(shù)據(jù)庫(kù)中,每次存儲(chǔ)采集到的數(shù)據(jù)都會(huì)覆蓋掉原來(lái)的數(shù) 據(jù),保證數(shù)據(jù)庫(kù)中的數(shù)據(jù)時(shí)實(shí)時(shí)更新的。
[0154] 將緩沖區(qū)中的明文數(shù)據(jù)傳給SM4并行加密模塊,利用基于GPU的改進(jìn)SM4并行算法 對(duì)數(shù)據(jù)進(jìn)行加密,其流程圖如圖3,其具體步驟為:
[0155] 步驟1、利用基于AES-128密鑰擴(kuò)展算法進(jìn)行輪密鑰擴(kuò)展,如圖4所示。。輪密鑰只需 要生成一次,可在整個(gè)加密過(guò)程中循環(huán)使用。在CPU執(zhí)行一次密鑰擴(kuò)展,生成輪密鑰,具體過(guò) 程如下:
[0156] 步驟1.1、將16字節(jié)(128位)的初始密鑰按照列順序組成4個(gè)32bit的字,分別記為 W0-W3 〇
[0157] 步驟1.2、在初始密鑰的基礎(chǔ)上依次新增31個(gè)字Wj,每一個(gè)新增的字Wj的值依賴于 Wj-1 和Wj-4,艮P :
[0158] 當(dāng)j除以4的余數(shù)不為0時(shí),Wj=Wj-4 Φ Wj-1;
[0159] 當(dāng) j除以4的余數(shù)為0時(shí),Wj=Wj-4? g(wj-i);
[0160] 步驟1.3、利用上述產(chǎn)生的字生成SM4加密算法中用到的擴(kuò)展密鑰,即擴(kuò)展密鑰riu = Wj+4;
[0161] 上述g()是一個(gè)復(fù)雜函數(shù),如圖5所示,其計(jì)算過(guò)程如下:
[0162] 步驟(1)、將傳入的一個(gè)字wh按照字節(jié)為單位,排列表示成 并將…山及而通環(huán)左移一個(gè)字節(jié)^變換成他及而心]。
[0163] 步驟(2)、利用AES的S盒對(duì)輸入字的每個(gè)字節(jié)進(jìn)行字節(jié)替換,變?yōu)閇B' i,B ' 2,B ' 3, B,o]。
[0164] 步驟(3)、將產(chǎn)生的結(jié)果[8'1,8'2,8'3,8'0]與輪常數(shù)此」進(jìn)行異或輸出。
[0165] 步驟1.3、用上述產(chǎn)生的字生成SM4加密算法中用到的擴(kuò)展密鑰,即rki = wj+4, i = 0,1,…,31〇
[0166] 上述j = 4,5,6……35;? = 0,1,···,31。
[0167] 步驟2、隨機(jī)生成1個(gè)32位的隨機(jī)數(shù)G。申請(qǐng)GPU全局存儲(chǔ)空間,將明文數(shù)據(jù)、上述產(chǎn) 生的擴(kuò)展密鑰、隨機(jī)數(shù)G和S盒從內(nèi)存?zhèn)鞯紾PU全局存儲(chǔ)空間內(nèi)。
[0168] 步驟3、利用GPU進(jìn)行并行SM4加密。將輸入數(shù)據(jù)分成每塊128比特的數(shù)據(jù)分組,每個(gè) GTO線程塊負(fù)責(zé)加密一個(gè)數(shù)據(jù)分組。通過(guò)調(diào)用核函數(shù)cryptKernel〈〈〈dmgrid,dmblock>>> (d_sk,d_input,d_output)對(duì)分組的加密處理,由多個(gè)塊并行執(zhí)行。其中,dmgrid表示網(wǎng)格 的三維數(shù)據(jù),dmblock表示塊的三維結(jié)構(gòu),d_sk表示擴(kuò)展密鑰,d_input表示明文,d_output 表示加密后的密文。每一個(gè)GPU線程的加密過(guò)程如下:
[0169]步驟3.1、計(jì)算該線程的id號(hào)。
[0170] 步驟3.2、通過(guò)該線程的id號(hào)獲取該線程要處理的數(shù)據(jù)。
[0171] 步驟3.3、利用改進(jìn)后的SM4加密算法,對(duì)數(shù)據(jù)進(jìn)行32輪循環(huán)迭代加密處理,改進(jìn)后 算法的輪函數(shù)如圖6所示,具體過(guò)程如下:
[0172] (1)、根據(jù)本次迭代次數(shù),確定隨機(jī)數(shù)G相應(yīng)位上的數(shù)值。當(dāng)為0時(shí),計(jì)算Χ1+1 θ χ1+2 ? Xi + 3 ? rki;當(dāng)為1時(shí),計(jì)算Xi + 1 + Xi + 2 + Xi + 3 Θ rki,將結(jié)果按照字節(jié)順序排列保存為 A. = a3.) € (ζ|)4?
[0173] (2)、將上一步的A = (a^apa^aj e 進(jìn)行s和變換,輸出按照字節(jié)順序 排列保存為B = (b.。,!%, b.2, b.3) £ (z|.)4,則(bo,bi,b2,b3) = τ(Α) = (Sbox(ao),Sbox (ai),Sbox(a2),Sbox(a3))
[0174] (3)、將上一步的B e (Z|)4進(jìn)行線性變換,輸出保存為C € (Z|)4則:C=L(B) = (B?<0) ? (B?<2) ? (B?<10) ? (B?<18) ? (B?<24)
[0175] (4)、將上一步生成的C G (Z|)4和本次的輸入Xi進(jìn)行異或運(yùn)算,計(jì)算 Xi+l,Xi+2,Xi+3,Xi+4作為下一次輪循環(huán)的輸入。
[0176] (5 )、重復(fù)上述(1)~(4)中操作,將上一輪移位后數(shù)據(jù)作為新一輪輸入,重復(fù)32次。 經(jīng)過(guò)32輪后,輸出密文數(shù)據(jù)為(Y〇,Yi,Y 2,Y3 ) = (X35,X34,X33,X32 )
[0177] 式中,Xi-Xm表示第i輪輸入的明文數(shù)據(jù),F(xiàn)〇表示輪函數(shù),Τ〇表示合成變換函數(shù), τ()表示置換變換函數(shù),Sbox()為S盒變換函數(shù),L()表示線性變換函數(shù),表示第i輪使 用的擴(kuò)展密鑰。
[0178]步驟4、加密完成后,輸出數(shù)據(jù)的結(jié)果將再次被寫到全局設(shè)備存儲(chǔ)器內(nèi),隨后,CPU 程序?qū)⑤敵鰯?shù)據(jù)結(jié)果從GPU的全局設(shè)備存儲(chǔ)器內(nèi)取回,整個(gè)加密過(guò)程完成。
[0179] 步驟5、利用socket連接,將上述加密的密文數(shù)據(jù)通過(guò)TCP/IP協(xié)議發(fā)送給中心監(jiān) 控。
[0180] 步驟6、中心監(jiān)控系統(tǒng)通過(guò)TCP/IP協(xié)議接收采集節(jié)點(diǎn)發(fā)送的密文數(shù)據(jù),并傳遞給 GPU并行解密模塊。
[0181] 步驟7、GPU并行加密模塊利用基于GPU的改進(jìn)SM4并行算法對(duì)數(shù)據(jù)進(jìn)行解密,其過(guò) 程與加密過(guò)程基本相同,在此進(jìn)行簡(jiǎn)要闡述:
[0182] 步驟7.1、將接收到的密文數(shù)據(jù)、擴(kuò)展密鑰、隨機(jī)數(shù)G、和S盒從主存?zhèn)鞯紾PU全局存 儲(chǔ)空間內(nèi)。
[0183] 步驟7.2、同樣加密過(guò)程一樣,利用基于GPU的改進(jìn)SM4并行算法對(duì)密文數(shù)據(jù)進(jìn)行解 密。將密文數(shù)據(jù)分成每塊128比特的數(shù)據(jù)分組,每個(gè)CUDA線程負(fù)責(zé)加密一個(gè)數(shù)據(jù)分組。每個(gè) 線程采用基于SM4并行算法解密一個(gè)數(shù)據(jù)分組。GPU線程在進(jìn)行32輪循環(huán)迭代加密處理時(shí), 根據(jù)G對(duì)應(yīng)位置上的取值,動(dòng)態(tài)選擇解密的輪函數(shù)。當(dāng)G的相對(duì)應(yīng)的位置的值為0時(shí),選擇使 用父糾=?(父1,父〇1,父〇2,父糾,迚31-〇=父1?1'(父1 +1?父糾《父糾《迚31-〇輪函數(shù);為1時(shí),使用 Xi+4 = F(Xi,Xi+1,Xi+2,Xi+3,rk31-i)=Xi? T(Xi+1+Xi+2+Xi+3? rk31-i)輪函數(shù)。
[0184] 步驟7.3、將各個(gè)線程解密輸出的明文數(shù)據(jù)從GPU的全局設(shè)備存儲(chǔ)器內(nèi)傳到內(nèi)存 中,整個(gè)解密過(guò)程完成。
[0185] 步驟8、將解密得到的數(shù)據(jù)存儲(chǔ)到MySQL數(shù)據(jù)庫(kù),并通過(guò)管理應(yīng)用程序進(jìn)行顯示。
[0186] 本發(fā)明基于Modbus協(xié)議的數(shù)據(jù)并行加密通信方法和系統(tǒng),提出基于MySQL數(shù)據(jù)庫(kù) 的配置應(yīng)用程序,根據(jù)實(shí)際的需求,產(chǎn)生配置信息表,存儲(chǔ)在數(shù)據(jù)庫(kù)中。將站點(diǎn)配置和數(shù)據(jù) 采集分開,可以很方面的增加或刪除站點(diǎn),擴(kuò)展性強(qiáng)。Modbus采集程序?qū)崿F(xiàn)了設(shè)備斷線重連 機(jī)制,確保在采集的過(guò)程中及時(shí)發(fā)現(xiàn)設(shè)備的連接狀態(tài),并在設(shè)備斷開連接是重新刷新連接。
[0187] 為了確保和提高數(shù)據(jù)傳輸過(guò)程中的安全性與實(shí)時(shí)性,改進(jìn)了 SM4加密算法。比原算 法主要改進(jìn)之處有四點(diǎn):1.利用AES-128密鑰擴(kuò)展算法生成SM4加密算法需要的32個(gè)輪密 鑰。新的密鑰擴(kuò)展算法,具有透明、簡(jiǎn)潔、實(shí)現(xiàn)速度快等優(yōu)勢(shì);2.替換SM4加密算法中的S盒, 使用高強(qiáng)度的AES-128的S盒。有助于抵抗傳統(tǒng)的線性密碼分析、差分密碼分析、代數(shù)攻擊及 最新的中間相遇攻擊等,提高了加密算法的安全性;3.將加解密函數(shù)中32迭代所用輪函數(shù) 由"固定函數(shù)"改為"動(dòng)態(tài)選擇",隨機(jī)數(shù)G的每一位作為每一輪迭代時(shí)動(dòng)態(tài)選擇的依據(jù);4.利 用GPU的并行計(jì)算能力,將串行SM4加密算法改進(jìn)成并行加密的形式,對(duì)實(shí)時(shí)數(shù)據(jù)進(jìn)行并行 加密,提高了加密速度,從而保證數(shù)據(jù)流正常的傳輸,降低處理延遲。
【主權(quán)項(xiàng)】
1. 基于Mo化US協(xié)議的數(shù)據(jù)并行加密通信方法,其特征是,包括如下步驟: 步驟1、配置應(yīng)用程序,即根據(jù)數(shù)據(jù)采集站點(diǎn)的實(shí)際需求,產(chǎn)生配置信息表; 步驟2、根據(jù)配置信息表里的信息對(duì)數(shù)據(jù)采集站點(diǎn)的設(shè)備運(yùn)行信息進(jìn)行采集,所采集到 的數(shù)據(jù)為明文數(shù)據(jù); 步驟3、利用基于GPU的動(dòng)態(tài)選擇的改進(jìn)SM4并行加密法對(duì)采集到的明文數(shù)據(jù)進(jìn)行加密; 即 步驟3.1、利用AES-128密鑰擴(kuò)展法生成SM4加密法所需的32個(gè)擴(kuò)展密鑰; 步驟3.2、隨機(jī)生成1個(gè)32位的隨機(jī)數(shù)G; 步驟3.3、利用GPU進(jìn)行并行SM4加密,即將明文數(shù)據(jù)分成每塊128比特的數(shù)據(jù)分組,一個(gè) 數(shù)據(jù)分組的加密任務(wù)分配給一個(gè)的GPU線程;每個(gè)GPU線程再進(jìn)行32輪循環(huán)迭代加密處理, 在每輪循環(huán)迭代加密處理時(shí),根據(jù)迭代的輪數(shù)確定隨機(jī)數(shù)G的對(duì)應(yīng)位置,并根據(jù)