范榮全, 鄭曉波, 曾嶸, 向圣軍, 陳少卿, 呂俊杰
(1.國網四川省電力公司,四川,成都 610000; 2.國網四川省電力公司天府新區供電公司,四川,成都 610000;3.成都榮耀科技有限公司,四川,成都 610000)
目前有關文件防篡改的技術主要針對常見格式位圖文件和SHP格式矢量圖文件。工程系統設計文件格式一般為DXF,具有多層次、多元素等特征,單層次單元素的位圖篡改檢測、定位技術不適用,而SHP文件和DXF文件相互轉換中會丟失大量數據,因此現有針對SHP格式的矢量圖文件的防篡改技術不適用于工程系統設計文件的篡改檢測。現有很多方法只能判斷文件是否被篡改,并不能對篡改處進行定位。
現有篡改檢測、定位算法均不適用于DXF格式設計文件,需要對DXF工程文件設計有針對性的篡改檢測和定位方法。
重要的設計文件不僅會受到外部黑客的攻擊,還會受到內部的惡意破壞和非法篡改。近年來,一些研究團體和學者對文件篡改定位已開展了很多相關的研究工作,取得了一定的研究成果。林意等[1]提出將文件頭信息作為圖像像素灰度值進行處理,利用MD5構造的哈希函數生成文件頭的信息摘要值,并將消息摘要值作為水印,以可逆不可見的方式嵌入DICOM圖形,使用提取水印與重新生成水印的差異進行文件頭信息篡改檢測,該方法對文件頭信息篡改具有極強的敏感性、較高的準確性,對大文件處理效率過慢。陳陽等[2]提出一種支持篡改定位的電子航海圖零水印算法,在ENC文件以經緯度表示的離散點坐標數據分布規律的基礎上,構造離散點經緯度坐標校驗碼的二值序列,引入經緯度坐標校驗碼和格網分塊技術,在保證ENC數據精度的同時,具備點位篡改定位的特性,主要應用在電子航海圖數據的版權保護上。SU等提出了一種基于混合Sudoku的圖像篡改檢測脆弱水印算法,水印虛擬地嵌入每個像素對中,產生臨時坐標信息,然后將臨時信息坐標隱藏到覆蓋圖像中,實驗表明精度較高,有效定位出篡改位置,但不適用于DXF文件。彭一航等提出一種基于遞進式混合特征的篡改圖片識別算法。算法針對SIFT特征無法區分自然相似區域與篡改區域的問題,結合矩特征的優點,提取合成子塊的遞進式混合調整來降低算法的虛警率。算法可以有效防止傳統圖片復制-粘貼的圖片篡改方式,但DXF文件篡改存在數據變更問題,并不適用。
本節針對DXF文件設計篡改檢測與定位方法。首先,詳細分析DXF文件的結構,找出改變元素會顯著改變的關鍵部分。提取這些關鍵部分元素借助默克爾樹生成防篡改碼[2-3]。最后通過對比實時生成的篡改碼與原始保存的防篡改碼是否一致來判斷文件是否被篡改,并通過回溯默克爾樹定位被篡改的位置。DXF結構如圖1所示。

圖1 DXF結構圖
DXF 圖形文件結構 DXF文件由標題段(Header)、表段 (Tables)、塊段(Block)、實體段(Entities)和文件結束段(EoF)共5部分組成。DXF通過每一行存儲相關數據,每兩行為一個組,第一行為組的代碼,第二行為組值,一個組就代表了一個數據的含義和值,DXF文件由大量的組構成。經過研究,對內容比較敏感的是其中的表圖層(Layer)、塊段(Blocks)和實體段(Entities),文件只要有改動必然反映在這些元素里。所以雖然DXF文件結構相當復雜,但根據需求,只要獲取其中的層表、塊段和實體段,就可以完成相應實體的提取[4-5]。
將DXF格式的工程系統設計文件進行分解,并按關鍵字提取特征。將層元素、塊元素和實體元素對應的序列進行拼接,將拼接結果作為設計文件的特征。
(1) 將表圖層中的關鍵字“TABLE 2 LAYER 5”作為表圖層的開始,將關鍵字“0 ENDTAB”作為表圖層的結束,將關鍵字“0 LEYER 5”所分割的數據作為表圖層的數據分片,以關鍵字定位并提取表圖層的每一個數據段構成表圖層數據序列L1,L2,…,Ln。
(2) 將塊段中的關鍵詞“0 SECTION 2 BLOCKS”作為塊段的開始,將關鍵字“100 AcDbBlockEnd 0 ENDSEC”作為塊段的結束,將關鍵字“0 ENDBLK 5”所分割的數據作為塊段的數據分片,以關鍵字定位并提取塊段的每一個數據段構成塊段數據序列B1,B2,…,Bm。
(3) 將實體段中的關鍵詞“0 SECTION 2 ENTITIES”作為實體段的開始,將關鍵字“0 ENDSEC”作為實體段的結束,將關鍵字“100 AcDbEntity 8”所分割的數據作為實體段的數據分片,以關鍵字定位并提取實體段的每一個數據段構成實體段數據序列E1,E2,…,ES。
(4) 把實體段中變量的個數定義為實體數量s。
將電力系統設計文件的特征L1,L2,…,Ln,B1,B2,…,Bm,E1,E2,…,ES作為底層葉子,之后相鄰的兩個節點的哈希值合并成一個字符串,然后計算這個字符串的哈希值,得到的就是這兩個節點的父節點的哈希值。如果該層樹節點個數是單數,那么對于最后剩下的節點,直接進行哈希運算以獲取父節點的值[6]。循環重復上述計算過程,最終計算得到最后一個節點的哈希值,將該節點的哈希值作為整棵樹的哈希,將默克爾樹的根節點哈希值作為設計文件的防篡改碼。DXF防篡改碼Merkle圖,如圖2所示。

圖2 DXF防篡改碼Merkle圖
由于防篡改碼生成比較耗時,為了提高檢測效率,在比較時先對比提取的實體是否一致:如果實體個數都不同,則肯定被篡改過;如果實體數目一致再生成篡改碼作進一步對比。
(1) 若均通過則獲取區塊里的工程系統設計文件,結束篡改檢測定位。
(2) 若未通過,則獲取當前工程系統設計文件的默克爾樹,并將其與區塊內的默克爾樹中各個層的特征值進行對比,根據圖層-影響此圖層塊段-影響此塊段實體的順序,定位設計文件被篡改的數據段,并生成篡改報告。篡改報告包括被篡改過的數據段集合[7-8]。
本文實驗了不同大小設計文件的篡改檢測定位效果和效率,實驗中使用的開發語言為Python。
獲取一個簡易的DXF圖形,打開后如圖3所示。

圖3 DXF篡改前可視化圖
這圖形主要由4條直線和10個圓圈組成。
對這個DXF分析,DXF文件篡改前結構組成,如圖4所示。

圖4 DXF文件篡改前結構組成圖
可以得知這個文件是由編號44-4D的圓組成和編號52-55的線段組成,DXF版本號為AC1015,層段為1個,塊段為3個,實體段為14個。
對DXF文件進行更改,將其中2個圓改成兩個線段。修改后如圖5所示。

圖5 DXF篡改后可視化圖
然后對該DXF文件進行解析,得圖6。

圖6 DXF文件篡改后結構組成圖
原圖形圓44和圓45變為線段98和線段99。
文件版本號變為AC1032,層由1個變為2個。通過分析可以得到圖形由多少類型的小塊構成,那么該圖形有多少實體。
若刪去一個線段99,實體便會變為13個,如圖7所示。

圖7 DXF文件篡改后結構組成圖
判斷實體數量是否發生變化。如實體數量發生變化,文件被篡改。通過解析文件可以發現,文件具體發生變化的是哪個圖形。
對初始文件實體進行MD5哈希,如圖8所示。

圖8 篡改前實體MD5值
對DXF文件圖形進行修改,將圓44和圓45變為線段98和線段99,兩個MD5值發生變化,如圖9所示。

圖9 篡改后實體MD5值
兩個MD5值發生變化,可以判斷DXF文件被篡改。經過類似對比過程可以發現DXF設計文件的改動,目前實驗檢測準確率為98%以上,小型文件基本是百分百的檢測準確率。
以上是篡改方法有效的簡單實驗示例。下面對真實的DXF文件生成完整的默克爾樹,其根節點哈希值就是防篡改碼。為了觀察不同大小DXF文件生成防篡改碼的效率,本實驗以100 KB、1 MB和10 MB等3個不同大小量級的DXF文件為例。
首先對3個文件進行解析,生成根節點的數量如圖10所示。

圖10 根節點生成數量情況
通過圖表可以發現,若DXF文件量級達到10 MB,生成根節點的數量會達到上萬個。
不同大小文件生成根節點的時間如圖11所示。
如今大部分DXF文件的大小都是在100 KB到1 MB之間,100 KB大小文件生成根節點只需要0.2 s左右,而1 MB的文件生成根節點需要2 s左右,滿足實際需要。
本文提出了一種設計文件篡改檢測定位的方法,將多元素的DXF格式設計文件分解,按元素提取最重要的層、塊、實體元素和實體數量,構成設計文件的特征;接著,將提取的特征作為底層葉子,利用默克爾樹得到文件防篡改碼。實驗表明該方法可以檢測并定位設計文件的篡改位置,檢測準確率在98%以上,小型文件達到100%,且對比較大的設計文件的處理效率也在秒級,滿足實際使用需要。本文僅針對DXF格式文件篡改檢測方法進行研究,在后續研究中,仍需對其他格式文件防篡改技術進行完善。