PODOFO编译之4——加密测试

来源:互联网 发布:一座城池知乎 编辑:程序博客网 时间:2024/06/05 22:36

Podofo使用之加密测试

 

         Podofo编译后的都是命令行模式的exe程序,为了验证podofo库的正确性,特通过一个MFC程序来加密PDF文件。界面如下:

                                        

        该程序的代码即是podofo项目中的podofoenctypt。但是在库的使用方面则需进行一些设置,该项目名称为pdfEnctyptTest。

        需要忽略的库:libcmtd.lib、libcmt.lib;需要导入的库:openssl、freetype、libtiff、podofo、libidn;需要包含podofo相应的头文件。


         简介完毕,需要下载可直接转到 http://yunpan.cn/QDCX6Chx4zUND 处,下面的说明是在第一次编译及使用podofo的过程中出现的问题描述,不关心者可跳过。


        非常不幸的是该项目的debug版本在解析PDF文件时出现了bug,无法进行加密,但release版本则是没有问题的。

        在前面的podofo编译中曾提到过freetype的debug版本的库freetype252MT_D.lib。由于里面使用了包含md5的一些调试相关的宏,因此在用CMake编译podofo后会有一些md5函数和libeay32.lib相冲突,此时可以在CMake配置中直接使用release版本的freetype库,这样在编译podofo项目的时候就不会有函数冲突错误。在这种情况下,如果在pdfEnctyptTest项目中的debug版本也使用freetype252MT_D.lib的话,则其位置需要在podofo.lib库之后,且在libeay32.lib库之前,否则那些关于md5函数的冲突依然会出现。当然,此刻在debug版本中依然可以使用release版本的freetype库,但亦有其他问题(删除指针问题),见后续分析。

        坑爹的是即使解决了库函数冲突的问题之后,依然会出现致命bug。此时,在pdfEnctyptTest项目的EncrypePDF函数中,有一个PDF解析类PdfParser的对象parser的一个函数ParseFile,在执行这个函数的某一时刻,会转到PdfEncrypt文件的PdfEncryptMD5Base::ComputeEncryptionKey函数中(651行),而在这个函数中的一个MD5调用MD5_Init时,它返回的结果不是程序需要的,后续的PDF解析无法继续进行了,其错误提示为"Errorinitializing MD5 hashing engine"

        于是采用其他方案,在freetype的编译中将src\base\ftobjs.c文件中关于FT_DEBUG_LEVEL_TRACE宏砍掉,且移除md5的两个文件后再进行debug版本的编译,此刻得到的freetype的debug版本的库即是没有了关于md5的,因此它就不会和openssl的库函数产生冲突了,在用CMake编译podofo时也可以使用它。

        当在pdfEnctyptTest项目的debug版本中使用修改过的没有md5的freetype库时,更坑爹的事情又发生了,同样是当调PdfParser类的对象parser的函数ParseFile时,依然在PdfEncrypt文件的PdfEncryptMD5Base::ComputeEncryptionKey函数中出现了致命bug。在该函数末尾进行了一个docId指针的释放操作,代码是没有问题的,但恰恰是在进行delete [] docId时,内存泄露错误不可避免地产生了。在delete操作的执行函数中,于“_ASSERTE(_BLOCK_TYPE_IS_VALID(pHead->nBlockUse));”处的断言失败。关于此断言解说较详细的是在http://www.cnblogs.com/sura/archive/2012/07/03/2575448.html处的文章。

                                      

        至此,对于debug版本的程序再也无法继续了,只能留待解决了。不过幸运的是,对于release版本,则都不会出现上面的两个bug。当然,也可以在pdfEnctyptTest项目中直接调用podofo项目中编译得来的podofoencrypt.exe程序,通过它来执行PDF文件的加密操作。

        关于pdfEnctyptTest测试项目的代码可在http://download.csdn.net/detail/yaoyuanyylyy/6766149处下载,其中包含了所有的编译得来的库文件,freetype库则是去掉了md5的。

 

 

 

0 0
原创粉丝点击