AutoCAD圖形文件加密之ARX技術(shù)

AutoCAD軟件因其強(qiáng)大的生命力和行業(yè)適應(yīng)性,被廣泛應(yīng)用于機(jī)械、電子、建筑等各個(gè)行業(yè)。再加上行業(yè)競(jìng)爭(zhēng)性和產(chǎn)品的保密要求,在實(shí)際工作中,有些單位提出需要有更高的保密要求,只允許自己?jiǎn)挝坏挠?jì)算機(jī)能打開(kāi)需要保密的圖形文件。這樣,即使圖形文件流失到別的單位,其它沒(méi)有授權(quán)的計(jì)算機(jī)仍無(wú)法打開(kāi)文件。為此我們?cè)贏utoCAD的二次開(kāi)發(fā)工具objecrARX的開(kāi)發(fā)原理和特點(diǎn)的基礎(chǔ)上,結(jié)合實(shí)際工程要求提出了一個(gè)基于ARX技術(shù)的AutoCAD圖形文件加密方法。

一、objectARX的開(kāi)發(fā)原理

1、objectARX應(yīng)用程序的運(yùn)行機(jī)制

基于Obj ectARX開(kāi)發(fā)出的應(yīng)用程序本身不是一個(gè)單獨(dú)運(yùn)行的程序,而是作為AutoCAD的一個(gè)DLL(動(dòng)態(tài)鏈接庫(kù))在需要的時(shí)候由AutoCAD動(dòng)態(tài)加載,所以基于Obj ectARX開(kāi)發(fā)應(yīng)用程序的過(guò)程也就是為AutoCAD開(kāi)發(fā)DLL的過(guò)程。通過(guò)Obj ectARX程序,用戶可以注冊(cè)自己的AutoCAD命令,這些命令和AutoCAD內(nèi)部命令一樣使用,它支持MFC,可以利用MFC編寫(xiě)功能強(qiáng)大、具有Windows風(fēng)格的用戶圖形界面程序。

一個(gè)DLL被最終調(diào)用者應(yīng)用程序(直接或間接)加載后運(yùn)行在調(diào)用者應(yīng)用程序空間,所以基于Obj ectARX開(kāi)發(fā)的應(yīng)用程序比AutoLisp等開(kāi)發(fā)的程序運(yùn)行速度更快。另外,在建立Obj ectARX的應(yīng)用程序時(shí),通過(guò)指定ARX應(yīng)用程序模塊所需引用庫(kù)路徑后,ARX應(yīng)用程序就可以直接調(diào)用AutoCAD的API函數(shù),并且訪問(wèn)AutoCAD數(shù)據(jù)庫(kù)的核心數(shù)據(jù)結(jié)構(gòu)和代碼。這樣Obj ectARX應(yīng)用程序模塊與AutoCAD的集成度更高,性能也就更穩(wěn)定。

2、objectARX應(yīng)用程序的基本結(jié)構(gòu)

Obj ectARX為AutoCAD二次開(kāi)發(fā)人員提供了基于C++語(yǔ)言的面向?qū)ο蟮木幊汰h(huán)境。

AutoCAD與ARX的應(yīng)用程序模塊間的通訊采用消息傳遞的方式,提供了一個(gè)消息入口函數(shù)acrxEntryPointo。這個(gè)函數(shù)是AutoCAD與ObjectARX應(yīng)用程序之間消息傳遞的途徑。

以下是該函數(shù)和它所調(diào)用函數(shù)的原型、函數(shù)功能描述以及它們之間調(diào)用關(guān)系的說(shuō)明。

ARX編程一般結(jié)構(gòu)為:

#include//包含頭文件

...

extem "c" AcRx::AppRetcode acrxEntrypoint(AcRx::AppMsgcode msg. void*pkt)//程序入口函數(shù),AcRx::AppRetcode是返回給AutoCAD的狀態(tài)碼,msg是ARX內(nèi)核向應(yīng)用程序發(fā)出的消息,pkt是回調(diào)數(shù)據(jù)信息指針

{switch(msg)//判斷msg消息類型

case AcRx::kInitAppMsg;//加載ARX時(shí),AutoCAD發(fā)給應(yīng)用程序的消息acrxDynamicLinker->unloadApplication(pkt);//允許卸載應(yīng)用程序

initApp0;//調(diào)用initApp0初始化函數(shù)

break;

case AcRx::kUnloadAppMsg;//用戶卸載應(yīng)用程序或者關(guān)閉當(dāng)前任務(wù)時(shí),AutoCAD發(fā)給應(yīng)用程序的消息

unloadApp0;//調(diào)用卸載函數(shù)

break;

default:

break;

retum AcRx::kRetok; //ARX應(yīng)用程序返回給AutoCAD的狀態(tài)碼

}

void initApp()//ARX應(yīng)用程序初始化

{…}

void unloadApp0//刪除該程序的命令組

{…}

void function0 11用戶為完成特定任務(wù)編寫(xiě)的命令函數(shù)

{…}

acrxEntrypoint0函數(shù)是必須要定義的函數(shù),AutoCAD通過(guò)它來(lái)調(diào)入一個(gè)ARX應(yīng)用程序。此函數(shù)代替了C++程序中的main0函數(shù)。AutoCAD使用這個(gè)函數(shù)同用戶定義的新命令建立內(nèi)部聯(lián)系。

用戶自定義的函數(shù)是程序的主體部分,可以結(jié)合MFC編程實(shí)現(xiàn)對(duì)話框的定義和激活,以及用戶所設(shè)計(jì)的具體功能等。

另外,還要定義兩個(gè)函數(shù)addCommand()和removeGroup()。addC ommand0主要用來(lái)注冊(cè)用戶的一個(gè)自定義命令,當(dāng)用戶新注冊(cè)一個(gè)命令時(shí),頁(yè)同時(shí)為它指定了一個(gè)組名。removeGroup()函數(shù)主要用來(lái)刪除命令組,同時(shí)組中的所有命令頁(yè)同時(shí)被刪除,頁(yè)可以用removeCmd()函數(shù)來(lái)刪除特定組中的命令,而不是刪除整個(gè)組。

二、AutoCAD圖形文件的加密方法

1、AutoCAD圖形文件的加密原理

本文提出一種采用二進(jìn)制字節(jié)文件進(jìn)行文件的加密處理方法,可對(duì)任何形式的文件進(jìn)行加密變換。對(duì)本文中的AutoCAD圖形文件的加密過(guò)程同其它字符一樣,不需要專門處理。對(duì)于文件中的控制字符也不需進(jìn)行判斷。通過(guò)解密程序后,可恢復(fù)成與原圖形文件完全一樣。

高級(jí)語(yǔ)言處理文件時(shí),大多以ASCII碼形式處理的。當(dāng)磁盤文件中的信息被讀入內(nèi)存時(shí),需要事先知道信息的類型,才能分別對(duì)其處理。當(dāng)讀入的信息類型與所設(shè)變量的類型不符時(shí),就會(huì)發(fā)生錯(cuò)誤。因此這些限制條件在程序編制時(shí)將會(huì)帶來(lái)某些因難。而二進(jìn)制字節(jié)文件則不同,它把磁盤文件看作是一個(gè)字節(jié)序列,而不考慮其中的數(shù)值型、字符型、字段、記錄、回車換行等文件結(jié)構(gòu)及控制字符,將它們一律看作二進(jìn)制數(shù)。這樣在讀入文件信息時(shí)的限制條件就取消了。例如TURBO BASIC語(yǔ)言、TURBO C語(yǔ)言等都可以處理這類文件。

加密算法是一些公式和法則,它規(guī)定了明文和密文之間的變換方法。現(xiàn)在為了增加加密算法的信息安全,許多系統(tǒng)通過(guò)密鑰系統(tǒng)來(lái)控制加密算法和解密算法的關(guān)鍵信息??紤]工程應(yīng)用,本文的加密和解密過(guò)程不涉及密鑰系統(tǒng),只是對(duì)二進(jìn)制文件按照一定算法進(jìn)行加密,在解密的過(guò)程中通過(guò)相反的算法即可恢復(fù)原有二進(jìn)制文件。也可以說(shuō),本文對(duì)文件的加密算法和解密算法是通過(guò)對(duì)二進(jìn)制文件的編解碼來(lái)實(shí)現(xiàn)的。

2、AutoCAD圖形文件加密和文件解密過(guò)程

使用本文提出的AutoCAD圖形文件的加密算法,需要編制兩個(gè)ARX應(yīng)用程序?qū)崿F(xiàn)兩個(gè)命令FileOpen和FileSave,并且重載AutoCAD系統(tǒng)的兩個(gè)內(nèi)部命令,即圖形文件的打開(kāi)和保存。

當(dāng)運(yùn)行AutoCAD系統(tǒng)并且執(zhí)行File->Open命令時(shí),所執(zhí)行的命令已經(jīng)不是系統(tǒng)原有的內(nèi)部命令,而是本文所定義的ARX程序定義的FileOpen命令了。在FileOpen命令中判斷所要打開(kāi)的文件是否經(jīng)過(guò)本系統(tǒng)加密的文件,是的話,就進(jìn)行文件解密,否則繼續(xù)運(yùn)行系統(tǒng)原有的File->Open命令。

這樣,運(yùn)行ARX應(yīng)用程序后的AutoCAD系統(tǒng)可以加密正常的AutoCAD圖形文件。具體流程如下:

Step 1:執(zhí)行AutoCAD的打開(kāi)文件命令(其實(shí)此時(shí)運(yùn)行的是本文自定義的FileOpen命令);

Step 2:判斷所要打開(kāi)的文件是否經(jīng)過(guò)本系統(tǒng)加密,如果是,繼續(xù)下一步,否則執(zhí)行Step 4;

Step 3:轉(zhuǎn)換為二進(jìn)制文件,按照設(shè)定加密算法的逆過(guò)程進(jìn)行解密,然后恢復(fù)為原形式文件;

Step 4:執(zhí)行AutoCAD系統(tǒng)原有的File->Open命令。

同理,當(dāng)運(yùn)行AutoCAD系統(tǒng)并且執(zhí)行File->Save命令時(shí),所執(zhí)行的命令已經(jīng)不是系統(tǒng)原有的內(nèi)部命令,同樣也是本文ARX程序所定義的FileSave命令了。

具體流程如下:

Step 1:執(zhí)行AutoCAD的保存文件命令(其實(shí)此時(shí)運(yùn)行的是本文自定義的FileSave命令);

Step 2:得到當(dāng)前工作空間的圖形文件,并且將之轉(zhuǎn)換為二進(jìn)制文件;

Step 3:按照設(shè)定的加密算法對(duì)該二進(jìn)制文件進(jìn)行加密,然后恢復(fù)為原形式文件;

Step 4:將加密后的文件返回到當(dāng)前工作空間,替換原有內(nèi)存中的字節(jié);

Step 5:執(zhí)行AutoCAD系統(tǒng)原有的File->Save命令。

小知識(shí)之ObjectARX

ObjectARX是AutoDesk公司針對(duì)AutoCAD平臺(tái)上的二次開(kāi)發(fā)而推出的一個(gè)開(kāi)發(fā)軟件包,它提供了以C++為基礎(chǔ)的面向?qū)ο蟮拈_(kāi)發(fā)環(huán)境及應(yīng)用程序接口,能真正快速的訪問(wèn)AutoCAD圖形數(shù)據(jù)庫(kù)。 與以往的 AutoCAD 二次開(kāi)發(fā)工具 AutoLISP 和ADS不同,ObjectARX應(yīng)用程序是一個(gè)DLL(動(dòng)態(tài)鏈接庫(kù)),共享AutoCAD的地址空間,對(duì)AutoCAD進(jìn)行直接函數(shù)調(diào)用。所以,使用ARX編程的函數(shù)的執(zhí)行速度得以大大提高。ARX 類庫(kù)采用了標(biāo)準(zhǔn)的C++類庫(kù)的封裝形式,這也大大提高了程序員編程的可靠度和效率。