当前位置:编程学习 > 网站相关 >>

如何加密数据文件和EXE文件(一)

作者:可俊(老王)

FOX类编程语言易学好用,在我国有着非常庞大的编制和使用队伍,由于其十分普及,在用资源非常丰富,加上其排序、检索速度之快,是VB和DELPHI在数据库处理上所不及的,因此,在未来很长一段时间里,是很难被其他语言所替代的。但其保密性差是也大家公认的。也许正是因为它的普及,只要稍为懂一点数据库知识的人,一打开数据表,其内容便一目了然,且可任意更改,其保密性和安全性可想而知。随着UNFOXpro.exe、Refox7.exe和Unfoxall等反编译软件的出现,你辛辛苦苦编的程序,即使编译成EXE文件,一经反编译,则你煞费苦心设置的版权符、验证关、口令、密码等都如同虚设。那么FOX类编程语言保密性差的弱点就真的没有办法避免吗?当然部是!办法肯定有。下面就这个问题,谈谈我的看法和我所采取的一些措施:

  先谈有关数据表 (DBF)(下同)的加密问题。

  数据表的加解密常见的有三种方式:

  1、直接在磁盘上加解密,即在关闭数据表文件后,对已保存在磁盘上的数据表文件进行加密,在每次蚩数据表文件前,先在磁盘上对数据表解密,然后再供FOX将其打开,其优点是:加解密简单容易,一般程序员用FOXPOR提供的低级文件函数都能编出加解密程序。缺点是:在WINDOWS的多任务环境下,很容易取得解密后的数据,且一旦系统出错,还未来得及加密就重新启动系统,那保留在磁盘上的就是解密后的数据,稍微懂得一点WINDOWS系统特性的程序员,一般不会采用此方式。

  2、在内存中对数据表的字段进行加解密,这又可分两种:

  A、用ASC()函数把字符转换成ASCII码,再对ASCII码进行 + - */运算,然后再用CHR()函数把运算后的ASCII码转换成字符,进行加解密。但这种方法有个缺点,即当加或乘时,其值容易大于255(FFH)即大于ASCII码的最大值,无法用CHR()再转换成字符,如果对运算后大于255的数据不加密,则解密时又会带来麻烦,即同是255,哪个是加密后的255,哪个是未加密的255呢?这也就是有人问为何汉字解密后会出现许多 同音汉字的原因。

  B、利用Vfp3.0以上版本提供的位操作函数bitxor()进行加解密,该加解密方法是C语言及汇编语言常用的加密方法,其原理是将一字节的8位二进制数与另一个二进制数进行异或操作,如用6个以上密匙(口令)进行加密,则在不知其密匙的情况下,是很难解密的。它还有一个优点是加解密用同一模块,即一次执行是加密,再次执行为解密。

  以下是其加解密例程:

  注:调用该过程时,需加密的数据表已打开,且为当前工作区

  Procedure jjmgc para Pass&&Pass是密匙,假设Pass=wjgwkj

  priv all

  mccd=len(Pass) &&取Pass密匙长度

  Sjbzds=fcou() &&取字段个数

  Dime Jmsz(Sjbzds) &&根据字段个数建立一维数组

  Go top

  Scan

  Scat to Jmsz&&读一条记录到数组

  For I=1 to Sjbzds

  If type(Jmsz(i))=C&&该字段是字符型吗

  Zdcd=len(trim(Jmsz(i))) &&取字段长度

  mc1=1

  For x=1 to Zdcd

  Jm1=asc(subs(Jmsz(I),x,1)) &&取字段中一个字节

  jm2=asc(subs(Pass,mc1,1))&&取Pass中一个字节

  jmjg=chr(bitxor(jm1,jm2))&&将JM1按JM2的值异或

  Jmsz(I)=stuf(Jmsz(I),x,1,jmjg) &&进行加密替换

  Endf

  Endi

  Endf

  Gath from Jmsz &&将加解密的数据,写入当前记录

  Ends

  retu

  以上代码在WINDOWS 98 Microsoft Visual FoxPro 3.0以上版本通过。

  3.在内存中直接对整个数据表文件(.DBF)加解密,这也有两种方法:

  A.借助现成工具,犹如UCDOSSDK所提供的DBFKey()函数那样,与FOX无缝连接,不装入LoadSdk用USE是无法打开数据表的,其优点是显而易见的,但目前在WINDOWS环境下还找不到这样的工具,而自己制作其难度大,一般程序员做不到。

  B.用Vfp提供的低级文件函数,配合Create Curso -SQL 和 Insert -SQL命令可实现类似UCDOSSDK所达到的功能,其原理是:

  先用低级文件函数自定义一个文件头(或着叫文件格式,象BMP、DOC等都有自己的文件格式),在文件头中可包含:文件头长度、字段名、字段类型、字段长度、每条记录长度、密匙(口令字)等,接着将您的记录按文件头规定的格式加密后顺序写入文件中,由于文件格式是您自定义的,所以一般是无法打开读取的。在使用时,用低级文件函数从您自定义的文件中先读取文件头的内容,读到字段名、字段类型、字段长度时,用CreateCurso-SQL 将其到新建的数据表中,读取记录后先解密,再用Insert-SQL到刚建的数据表中,然后就可正常使用了。结束使用需存盘时再按上述方法写入文件,该方法始终是在内存中进行的,故即使系统出错,重新启动系统也无妨。

  用这种方法加解密确实是在Vfp状态下比较好的办法,但可能由于大家对文件格式及文件头的概念不理解。实际起来有一定难度。我根据这个办法编制的可视类(vfpjmdbf.vcx)是专为VFP3.0以上版本制作的,对此感兴起的朋友可到我的网站:

  《编程园地》 http://cfyn.yeah.net 去下载试用。

  也可直接点这下载:http://vfp.3322.net/vfpgj/vfpjmdbf.zip

  以上我们只谈了如何用FOX类编程语言加密数据表的问题,从中大家会看到,如果只对数据表加解密,而对执行加解密的程序代码不加密,用Unfoxall等反编译软件将您的EXE文件反编译,那您的加解密方法及密匙(口令字),就很容易暴露,其加密的可靠性就有问题,那么如何才能加密和保护您的EXE程序呢?

  下次我们继续谈这个问题。

补充:综合编程 , 安全编程 ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,