AutoCAD软件因其强大的生命力和行业适应性,被广泛应用于机械、电子、建筑等各个行业。再加上行业竞争性和产品的保密要求,在实际工作中,有些单位提出需要有更高的保密要求,只允许自己单位的计算机能打开需要保密的图形文件。这样,即使图形文件流失到别的单位,其它没有授权的计算机仍无法打开文件。为此我们在AutoCAD的二次开发工具objecrARX的开发原理和特点的基础上,结合实际工程要求提出了一个基于ARX技术的AutoCAD图形文件加密方法。

一、objectARX的开发原理

1、objectARX应用程序的运行机制

基于Obj ectARX开发出的应用程序本身不是一个单独运行的程序,而是作为AutoCAD的一个DLL(动态链接库)在需要的时候由AutoCAD动态加载,所以基于Obj ectARX开发应用程序的过程也就是为AutoCAD开发DLL的过程。通过Obj ectARX程序,用户可以注册自己的AutoCAD命令,这些命令和AutoCAD内部命令一样使用,它支持MFC,可以利用MFC编写功能强大、具有Windows风格的用户图形界面程序。

一个DLL被最终调用者应用程序(直接或间接)加载后运行在调用者应用程序空间,所以基于Obj ectARX开发的应用程序比AutoLisp等开发的程序运行速度更快。另外,在建立Obj ectARX的应用程序时,通过指定ARX应用程序模块所需引用库路径后,ARX应用程序就可以直接调用AutoCAD的API函数,并且访问AutoCAD数据库的核心数据结构和代码。这样Obj ectARX应用程序模块与AutoCAD的集成度更高,性能也就更稳定。

2、objectARX应用程序的基本结构

Obj ectARX为AutoCAD二次开发人员提供了基于C++语言的面向对象的编程环境。

AutoCAD与ARX的应用程序模块间的通讯采用消息传递的方式,提供了一个消息入口函数acrxEntryPointo。这个函数是AutoCAD与ObjectARX应用程序之间消息传递的途径。

以下是该函数和它所调用函数的原型、函数功能描述以及它们之间调用关系的说明。

ARX编程一般结构为:

#include//包含头文件

...

extem "c" AcRx::AppRetcode acrxEntrypoint(AcRx::AppMsgcode msg. void*pkt)//程序入口函数,AcRx::AppRetcode是返回给AutoCAD的状态码,msg是ARX内核向应用程序发出的消息,pkt是回调数据信息指针

{switch(msg)//判断msg消息类型

case AcRx::kInitAppMsg;//加载ARX时,AutoCAD发给应用程序的消息acrxDynamicLinker->unloadApplication(pkt);//允许卸载应用程序

initApp0;//调用initApp0初始化函数

break;

case AcRx::kUnloadAppMsg;//用户卸载应用程序或者关闭当前任务时,AutoCAD发给应用程序的消息

unloadApp0;//调用卸载函数

break;

default:

break;

retum AcRx::kRetok; //ARX应用程序返回给AutoCAD的状态码

}

void initApp()//ARX应用程序初始化

{…}

void unloadApp0//删除该程序的命令组

{…}

void function0 11用户为完成特定任务编写的命令函数

{…}

acrxEntrypoint0函数是必须要定义的函数,AutoCAD通过它来调入一个ARX应用程序。此函数代替了C++程序中的main0函数。AutoCAD使用这个函数同用户定义的新命令建立内部联系。

用户自定义的函数是程序的主体部分,可以结合MFC编程实现对话框的定义和激活,以及用户所设计的具体功能等。

另外,还要定义两个函数addCommand()和removeGroup()。addC ommand0主要用来注册用户的一个自定义命令,当用户新注册一个命令时,页同时为它指定了一个组名。removeGroup()函数主要用来删除命令组,同时组中的所有命令页同时被删除,页可以用removeCmd()函数来删除特定组中的命令,而不是删除整个组。

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

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

本文提出一种采用二进制字节文件进行文件的加密处理方法,可对任何形式的文件进行加密变换。对本文中的AutoCAD图形文件的加密过程同其它字符一样,不需要专门处理。对于文件中的控制字符也不需进行判断。通过解密程序后,可恢复成与原图形文件完全一样。

高级语言处理文件时,大多以ASCII码形式处理的。当磁盘文件中的信息被读入内存时,需要事先知道信息的类型,才能分别对其处理。当读入的信息类型与所设变量的类型不符时,就会发生错误。因此这些限制条件在程序编制时将会带来某些因难。而二进制字节文件则不同,它把磁盘文件看作是一个字节序列,而不考虑其中的数值型、字符型、字段、记录、回车换行等文件结构及控制字符,将它们一律看作二进制数。这样在读入文件信息时的限制条件就取消了。例如TURBO BASIC语言、TURBO C语言等都可以处理这类文件。

加密算法是一些公式和法则,它规定了明文和密文之间的变换方法。现在为了增加加密算法的信息安全,许多系统通过密钥系统来控制加密算法和解密算法的关键信息。考虑工程应用,本文的加密和解密过程不涉及密钥系统,只是对二进制文件按照一定算法进行加密,在解密的过程中通过相反的算法即可恢复原有二进制文件。也可以说,本文对文件的加密算法和解密算法是通过对二进制文件的编解码来实现的。

2、AutoCAD图形文件加密和文件解密过程

使用本文提出的AutoCAD图形文件的加密算法,需要编制两个ARX应用程序实现两个命令FileOpen和FileSave,并且重载AutoCAD系统的两个内部命令,即图形文件的打开和保存。

当运行AutoCAD系统并且执行File->Open命令时,所执行的命令已经不是系统原有的内部命令,而是本文所定义的ARX程序定义的FileOpen命令了。在FileOpen命令中判断所要打开的文件是否经过本系统加密的文件,是的话,就进行文件解密,否则继续运行系统原有的File->Open命令。

这样,运行ARX应用程序后的AutoCAD系统可以加密正常的AutoCAD图形文件。具体流程如下:

Step 1:执行AutoCAD的打开文件命令(其实此时运行的是本文自定义的FileOpen命令);

Step 2:判断所要打开的文件是否经过本系统加密,如果是,继续下一步,否则执行Step 4;

Step 3:转换为二进制文件,按照设定加密算法的逆过程进行解密,然后恢复为原形式文件;

Step 4:执行AutoCAD系统原有的File->Open命令。

同理,当运行AutoCAD系统并且执行File->Save命令时,所执行的命令已经不是系统原有的内部命令,同样也是本文ARX程序所定义的FileSave命令了。

具体流程如下:

Step 1:执行AutoCAD的保存文件命令(其实此时运行的是本文自定义的FileSave命令);

Step 2:得到当前工作空间的图形文件,并且将之转换为二进制文件;

Step 3:按照设定的加密算法对该二进制文件进行加密,然后恢复为原形式文件;

Step 4:将加密后的文件返回到当前工作空间,替换原有内存中的字节;

Step 5:执行AutoCAD系统原有的File->Save命令。

小知识之ObjectARX

ObjectARX是AutoDesk公司针对AutoCAD平台上的二次开发而推出的一个开发软件包,它提供了以C++为基础的面向对象的开发环境及应用程序接口,能真正快速的访问AutoCAD图形数据库。 与以往的 AutoCAD 二次开发工具 AutoLISP 和ADS不同,ObjectARX应用程序是一个DLL(动态链接库),共享AutoCAD的地址空间,对AutoCAD进行直接函数调用。所以,使用ARX编程的函数的执行速度得以大大提高。ARX 类库采用了标准的C++类库的封装形式,这也大大提高了程序员编程的可靠度和效率。