范榮全, 鄭曉波, 曾嶸, 向圣軍, 陳少卿, 呂俊杰
(1.國網(wǎng)四川省電力公司,四川,成都 610000; 2.國網(wǎng)四川省電力公司天府新區(qū)供電公司,四川,成都 610000;3.成都榮耀科技有限公司,四川,成都 610000)
目前有關(guān)文件防篡改的技術(shù)主要針對常見格式位圖文件和SHP格式矢量圖文件。工程系統(tǒng)設(shè)計文件格式一般為DXF,具有多層次、多元素等特征,單層次單元素的位圖篡改檢測、定位技術(shù)不適用,而SHP文件和DXF文件相互轉(zhuǎn)換中會丟失大量數(shù)據(jù),因此現(xiàn)有針對SHP格式的矢量圖文件的防篡改技術(shù)不適用于工程系統(tǒng)設(shè)計文件的篡改檢測?,F(xiàn)有很多方法只能判斷文件是否被篡改,并不能對篡改處進行定位。
現(xiàn)有篡改檢測、定位算法均不適用于DXF格式設(shè)計文件,需要對DXF工程文件設(shè)計有針對性的篡改檢測和定位方法。
重要的設(shè)計文件不僅會受到外部黑客的攻擊,還會受到內(nèi)部的惡意破壞和非法篡改。近年來,一些研究團體和學(xué)者對文件篡改定位已開展了很多相關(guān)的研究工作,取得了一定的研究成果。林意等[1]提出將文件頭信息作為圖像像素灰度值進行處理,利用MD5構(gòu)造的哈希函數(shù)生成文件頭的信息摘要值,并將消息摘要值作為水印,以可逆不可見的方式嵌入DICOM圖形,使用提取水印與重新生成水印的差異進行文件頭信息篡改檢測,該方法對文件頭信息篡改具有極強的敏感性、較高的準(zhǔn)確性,對大文件處理效率過慢。陳陽等[2]提出一種支持篡改定位的電子航海圖零水印算法,在ENC文件以經(jīng)緯度表示的離散點坐標(biāo)數(shù)據(jù)分布規(guī)律的基礎(chǔ)上,構(gòu)造離散點經(jīng)緯度坐標(biāo)校驗碼的二值序列,引入經(jīng)緯度坐標(biāo)校驗碼和格網(wǎng)分塊技術(shù),在保證ENC數(shù)據(jù)精度的同時,具備點位篡改定位的特性,主要應(yīng)用在電子航海圖數(shù)據(jù)的版權(quán)保護上。SU等提出了一種基于混合Sudoku的圖像篡改檢測脆弱水印算法,水印虛擬地嵌入每個像素對中,產(chǎn)生臨時坐標(biāo)信息,然后將臨時信息坐標(biāo)隱藏到覆蓋圖像中,實驗表明精度較高,有效定位出篡改位置,但不適用于DXF文件。彭一航等提出一種基于遞進式混合特征的篡改圖片識別算法。算法針對SIFT特征無法區(qū)分自然相似區(qū)域與篡改區(qū)域的問題,結(jié)合矩特征的優(yōu)點,提取合成子塊的遞進式混合調(diào)整來降低算法的虛警率。算法可以有效防止傳統(tǒng)圖片復(fù)制-粘貼的圖片篡改方式,但DXF文件篡改存在數(shù)據(jù)變更問題,并不適用。
本節(jié)針對DXF文件設(shè)計篡改檢測與定位方法。首先,詳細分析DXF文件的結(jié)構(gòu),找出改變元素會顯著改變的關(guān)鍵部分。提取這些關(guān)鍵部分元素借助默克爾樹生成防篡改碼[2-3]。最后通過對比實時生成的篡改碼與原始保存的防篡改碼是否一致來判斷文件是否被篡改,并通過回溯默克爾樹定位被篡改的位置。DXF結(jié)構(gòu)如圖1所示。
圖1 DXF結(jié)構(gòu)圖
DXF 圖形文件結(jié)構(gòu) DXF文件由標(biāo)題段(Header)、表段 (Tables)、塊段(Block)、實體段(Entities)和文件結(jié)束段(EoF)共5部分組成。DXF通過每一行存儲相關(guān)數(shù)據(jù),每兩行為一個組,第一行為組的代碼,第二行為組值,一個組就代表了一個數(shù)據(jù)的含義和值,DXF文件由大量的組構(gòu)成。經(jīng)過研究,對內(nèi)容比較敏感的是其中的表圖層(Layer)、塊段(Blocks)和實體段(Entities),文件只要有改動必然反映在這些元素里。所以雖然DXF文件結(jié)構(gòu)相當(dāng)復(fù)雜,但根據(jù)需求,只要獲取其中的層表、塊段和實體段,就可以完成相應(yīng)實體的提取[4-5]。
將DXF格式的工程系統(tǒng)設(shè)計文件進行分解,并按關(guān)鍵字提取特征。將層元素、塊元素和實體元素對應(yīng)的序列進行拼接,將拼接結(jié)果作為設(shè)計文件的特征。
(1) 將表圖層中的關(guān)鍵字“TABLE 2 LAYER 5”作為表圖層的開始,將關(guān)鍵字“0 ENDTAB”作為表圖層的結(jié)束,將關(guān)鍵字“0 LEYER 5”所分割的數(shù)據(jù)作為表圖層的數(shù)據(jù)分片,以關(guān)鍵字定位并提取表圖層的每一個數(shù)據(jù)段構(gòu)成表圖層數(shù)據(jù)序列L1,L2,…,Ln。
(2) 將塊段中的關(guān)鍵詞“0 SECTION 2 BLOCKS”作為塊段的開始,將關(guān)鍵字“100 AcDbBlockEnd 0 ENDSEC”作為塊段的結(jié)束,將關(guān)鍵字“0 ENDBLK 5”所分割的數(shù)據(jù)作為塊段的數(shù)據(jù)分片,以關(guān)鍵字定位并提取塊段的每一個數(shù)據(jù)段構(gòu)成塊段數(shù)據(jù)序列B1,B2,…,Bm。
(3) 將實體段中的關(guān)鍵詞“0 SECTION 2 ENTITIES”作為實體段的開始,將關(guān)鍵字“0 ENDSEC”作為實體段的結(jié)束,將關(guān)鍵字“100 AcDbEntity 8”所分割的數(shù)據(jù)作為實體段的數(shù)據(jù)分片,以關(guān)鍵字定位并提取實體段的每一個數(shù)據(jù)段構(gòu)成實體段數(shù)據(jù)序列E1,E2,…,ES。
(4) 把實體段中變量的個數(shù)定義為實體數(shù)量s。
將電力系統(tǒng)設(shè)計文件的特征L1,L2,…,Ln,B1,B2,…,Bm,E1,E2,…,ES作為底層葉子,之后相鄰的兩個節(jié)點的哈希值合并成一個字符串,然后計算這個字符串的哈希值,得到的就是這兩個節(jié)點的父節(jié)點的哈希值。如果該層樹節(jié)點個數(shù)是單數(shù),那么對于最后剩下的節(jié)點,直接進行哈希運算以獲取父節(jié)點的值[6]。循環(huán)重復(fù)上述計算過程,最終計算得到最后一個節(jié)點的哈希值,將該節(jié)點的哈希值作為整棵樹的哈希,將默克爾樹的根節(jié)點哈希值作為設(shè)計文件的防篡改碼。DXF防篡改碼Merkle圖,如圖2所示。
圖2 DXF防篡改碼Merkle圖
由于防篡改碼生成比較耗時,為了提高檢測效率,在比較時先對比提取的實體是否一致:如果實體個數(shù)都不同,則肯定被篡改過;如果實體數(shù)目一致再生成篡改碼作進一步對比。
(1) 若均通過則獲取區(qū)塊里的工程系統(tǒng)設(shè)計文件,結(jié)束篡改檢測定位。
(2) 若未通過,則獲取當(dāng)前工程系統(tǒng)設(shè)計文件的默克爾樹,并將其與區(qū)塊內(nèi)的默克爾樹中各個層的特征值進行對比,根據(jù)圖層-影響此圖層塊段-影響此塊段實體的順序,定位設(shè)計文件被篡改的數(shù)據(jù)段,并生成篡改報告。篡改報告包括被篡改過的數(shù)據(jù)段集合[7-8]。
本文實驗了不同大小設(shè)計文件的篡改檢測定位效果和效率,實驗中使用的開發(fā)語言為Python。
獲取一個簡易的DXF圖形,打開后如圖3所示。
圖3 DXF篡改前可視化圖
這圖形主要由4條直線和10個圓圈組成。
對這個DXF分析,DXF文件篡改前結(jié)構(gòu)組成,如圖4所示。
圖4 DXF文件篡改前結(jié)構(gòu)組成圖
可以得知這個文件是由編號44-4D的圓組成和編號52-55的線段組成,DXF版本號為AC1015,層段為1個,塊段為3個,實體段為14個。
對DXF文件進行更改,將其中2個圓改成兩個線段。修改后如圖5所示。
圖5 DXF篡改后可視化圖
然后對該DXF文件進行解析,得圖6。
圖6 DXF文件篡改后結(jié)構(gòu)組成圖
原圖形圓44和圓45變?yōu)榫€段98和線段99。
文件版本號變?yōu)锳C1032,層由1個變?yōu)?個。通過分析可以得到圖形由多少類型的小塊構(gòu)成,那么該圖形有多少實體。
若刪去一個線段99,實體便會變?yōu)?3個,如圖7所示。
圖7 DXF文件篡改后結(jié)構(gòu)組成圖
判斷實體數(shù)量是否發(fā)生變化。如實體數(shù)量發(fā)生變化,文件被篡改。通過解析文件可以發(fā)現(xiàn),文件具體發(fā)生變化的是哪個圖形。
對初始文件實體進行MD5哈希,如圖8所示。
圖8 篡改前實體MD5值
對DXF文件圖形進行修改,將圓44和圓45變?yōu)榫€段98和線段99,兩個MD5值發(fā)生變化,如圖9所示。
圖9 篡改后實體MD5值
兩個MD5值發(fā)生變化,可以判斷DXF文件被篡改。經(jīng)過類似對比過程可以發(fā)現(xiàn)DXF設(shè)計文件的改動,目前實驗檢測準(zhǔn)確率為98%以上,小型文件基本是百分百的檢測準(zhǔn)確率。
以上是篡改方法有效的簡單實驗示例。下面對真實的DXF文件生成完整的默克爾樹,其根節(jié)點哈希值就是防篡改碼。為了觀察不同大小DXF文件生成防篡改碼的效率,本實驗以100 KB、1 MB和10 MB等3個不同大小量級的DXF文件為例。
首先對3個文件進行解析,生成根節(jié)點的數(shù)量如圖10所示。
圖10 根節(jié)點生成數(shù)量情況
通過圖表可以發(fā)現(xiàn),若DXF文件量級達到10 MB,生成根節(jié)點的數(shù)量會達到上萬個。
不同大小文件生成根節(jié)點的時間如圖11所示。
如今大部分DXF文件的大小都是在100 KB到1 MB之間,100 KB大小文件生成根節(jié)點只需要0.2 s左右,而1 MB的文件生成根節(jié)點需要2 s左右,滿足實際需要。
本文提出了一種設(shè)計文件篡改檢測定位的方法,將多元素的DXF格式設(shè)計文件分解,按元素提取最重要的層、塊、實體元素和實體數(shù)量,構(gòu)成設(shè)計文件的特征;接著,將提取的特征作為底層葉子,利用默克爾樹得到文件防篡改碼。實驗表明該方法可以檢測并定位設(shè)計文件的篡改位置,檢測準(zhǔn)確率在98%以上,小型文件達到100%,且對比較大的設(shè)計文件的處理效率也在秒級,滿足實際使用需要。本文僅針對DXF格式文件篡改檢測方法進行研究,在后續(xù)研究中,仍需對其他格式文件防篡改技術(shù)進行完善。