一种基于Zlib库和AES算法的ZIP包解压方法与流程

文档序号:12600344阅读:620来源:国知局
本发明涉及计算机信息安全
技术领域
,是一种基于Zlib开源压缩和解压缩项目,对其进行优化,加入AES解密算法。由应用程序调用Zlib的动态链接库来对AES加密的ZIP包进行解密解压的方法。
背景技术
:科技的发展使计算机深入到我们生活的方方面面,而压缩作为一种非常典型的技术,应用到很多场合,比如文件系统,数据库,消息传输等各类场合。压缩可以分为无损压缩和有损压缩;有损,指的是在压缩之后无法完整地还原原始信息,但压缩率高;无损压缩则用于文件等必须完整还原信息的场合,本文提到的ZIP文件就是一种无损压缩。在实际应用中,经常需要实现对各个网站的上网数据进行读取和分析,提取出感兴趣的信息。但各个网站的上网数据文件内容非常庞大,需要对数据进行压缩;为了防止信息泄露,还对数据进行了加密处理。AES(TheAdvancedEncrypionStandard)是美国国家标准与技术研究所用于加密电子数据的规范。它被广泛应用到金融、电信和政府数字信息等领域。AES是一个迭代的,对称密钥分组的密码,它可以使用128,192,256位密钥,并且用128位(16字节)分组加密和解密数据。Zlib是一个免费、通用、不受任何法律阻碍的、无损的数据压缩开发库,而且还是跨平台的开源项目。这意味着任何人都可以修改、使用而无需交纳任何费用,这也是对各个网站的上网数据进行读取和分析时,通常使用Zlib库进行开发的主要原因,并且ZIP格式属于几种主流的压缩格式之一。在使用Zlib库对各个网站的上网数据进行读取和分析时,通常采用Linux自带的Zlib库函数对数据进行压缩和解压,一些网站上报的数据采用7-zip软件加密压缩成ZIP包,而7-zip软件采用AES算法对数据进行加密。但Zlib只支持简单的加密算法,并不支持AES加密解密算法;所以随之带来的问题是Zlib库不能正常处理网站上报的采用AES加密的数据。技术实现要素:本发明的目的是提供一种基于Zlib开源库,结合AES解密算法,能自动且准确地对7-zip软件加密压缩的文件进行解密解压,通过仅添加libz.so动态链接库和libaes.a静态链接库即可处理网站上报加密的ZIP包。本发明采用的技术方案如下:一种基于Zlib库和AES算法解压ZIP包的方法,包括以下步骤:1)获取网站的ZIP包数据,从ZIP包中读取文件并判断其是否采用AES算法进行加密;2)对于采用AES算法进行加密的ZIP包数据,在Zlib库基础上添加AES算法来对ZIP包进行解密和解压。进一步地,步骤2)将AES算法封装在静态库文件中,将Zlib库封装在libz.so动态库文件中。进一步地,所述AES加密解密算法包括:a.AES加密过程:SubBytes(字节替代),ShiftRows(行移位),MixColumns(列混淆),AddRoundKey(轮密钥加);b.AES解密过程:InvSubBytes(逆字节替代),InvShiftRows(逆行移位),InvMixColumns(逆列混淆)AddRoundKey(轮密钥加)。本发明的优点和积极效果如下:由于本发明中,对开源压缩Zlib项目进行改进和优化,加入AES解密算法;这正是7-zip的加密算法,从而对于网站运营商上报的数据可以准确并快速处理。另外,Zlib解压算法采用libz.so动态库的方式,而AES算法采用封装成静态库方式,在处理网站上报的数据时可以自动安装,不需要升级系统的Zlib库,这样避免了操作系统版本过低带来另外问题;最后本发明采用的Zlib解压算法具有比7-zip算法效率高、占有CPU少的优点。附图说明图1是处理网站上报数据的流程图;图2是调用Zlib解压ZIP文件流程图;图3是AES加密解密流程图;图4是SubBytes(字节替代)矩阵示意图;图5是ShiftRows(行移位)示意图;图6是7zip和Zlib解压时间对比图。具体实施方式下面通过具体实施例和附图,对本发明做进一步说明。图1是展示了现有技术中处理网站上报数据的整个流程。如该图所示,首先从现场的搬运程序接收到ZIP包数据,扫描相应的目录,然后解压ZIP包文件,再扫描解压ZIP包文件后的bcp文件和实体文件,最后对bcp文件进行格式转换,即取得无效数据和对有效的数据进行校验,再从这些有效的数据中提取特定的信息;实体文件入全文数据库。本文发明是在原有Zlib库基础上,添加AES算法来解压ZIP包的方法,位于图1的第三个环节。一.解压模块设计尽管7zip的压缩率很高,且支持AES加密和解密,但7zip占用cpu很高,这会很大程度上影响其在处理网站上报数据时的实时性,所以本方法中采用Zlib库来解压ZIP文件。Zlib库属于开源库,采用DEFLATE压缩算法,只支持简单加密解密功能;但不支持AES加解密算法,所以要想解压AES算法加密的ZIP包,就必须修改开源库Zlib代码添加AES加解密算法。为了不影响之前调用的接口,把AES算法封装在libaes.a静态库文件中(libaes.a为本发明自己定义的静态库名称);Zlib库封装在libz.so动态库文件中。这么做的好处是无论怎么修改代码,只需更新这两个库文件不必修改其他的程序。修改unzip.c文件,增加修改unzOpenCurrentFilePassword函数,此函数主要功能获得ZIP文件信息;判断HEADID若是0x9901则ZIP包采用AES加密;读取版本号;读取两字节判断是否为‘A’和‘E’;读取ZIP包加密模式,这里应该是AES;读取ZIP包压缩模式。修改unzReadCurrentFile函数,此函数主要功能读取ZIP包中的文件内容,判断之前读取的ZIP加密模式;若是AES则调用libaes.a静态库进行解密,用已知的密钥进行解密得到明文。解压流程:如图2所示,包括:打开ZIP流,获取ZIP文件的信息,打开当前定位的文件,循环读取文件(若是AES加密则对读取数据进行AES解密),关闭当前文件,关闭ZIP流。具体步骤如下:1.以文件流的方式打开ZIP包;2.定位到压缩文件中的第一个文件;3.获得ZIP相关的文件信息,若是目录则继续递归,若是文件则创建文件;4.打开当前定位到文件,获取ZIP信息,判断是否是AES加密,若是则初始化AES信息结构体,本发明将该结构体称为aes_cox;5.从当前ZIP包中读取文件,循环读取,判断是否是AES加密,若是将内容解密读出,并将读到的内容写入到之前创建的文件中;6.设置文件时间戳;7.关闭当前读取的文件,释放之前动态分配的AES信息结构的内存;8.若ZIP包中还存在其他文件,定位到下一个文件;9.关闭打开的流。二.AES加密和解密算法构成如图3所示,AES加密算法的核心部分包括:SubBytes(字节替代),ShiftRows(行移位),MixColumns(列混淆),AddRoundKey(轮密钥加)。AES解密算法是加密的逆过程,所以除了AddRoundKey(轮密钥加)不变外,其余的都需要进行逆变换,InvSubBytes(逆字节替代),InvShiftRows(逆行移位),InvMixColumns(逆列混淆)。1.字节代替字节代替的主要功能是通过S盒完成一个字节到另外一个字节的映射。它是一个关于字节的非线性变换,它将状态中的每一个字节非线性地变换为另一个字节,代替表S盒是可逆的;如图4所示。字节代替分为:正向字节代替和逆向字节代替。2.行移位行移位的功能是实现一个4*4矩阵内部字节之间的置换。行移位分为:正向行移位和逆向行移位。正向行移位的操作即是:第一行保存不变,第二行循环左移1个字节,第三行循环左移2个字节,第四行循环左移3个字节,如图5所示。逆向行移位即是相反的操作。3.列混淆列混淆:是对一个状态逐列进行变换,即使用线性转换来混合每列的四个字节。列混淆分为:正向列混淆和逆向列混淆。4.轮密钥加在轮密钥加过程中,使用简单的按位异或操作,通过密钥调度过程对密钥进行扩展而得到轮密钥,然后明文与相应的子密钥异或即可,即每轮的输入与轮密钥异或一次;因此,解密时再异或上该轮的密钥即可恢复输入。5.密钥调度密钥调度包括两部分:密钥扩展和轮密钥选取。密钥扩展的作用是在数据加密/解密前得到轮变换中使用的轮密钥。综上所述,从AES加密解密流程图也可以得知,AES加密和解密都是一个迭代的过程;在迭代过程中对数据进行重复置换,直到得到最后的明文或密文。三.程序中调用的APIAPI1:解压文件voidunzip_extract(char*pZipFile,char*pExtractDir)输入参数:1)解压文件名称,2)解压目录名称;返回值:无。API2:打开文件流void*unzOpen(char*pZipFile)输入参数:1)解压文件名称;返回值:1)转换成void*形式的文件流指针。API3:定位到第一个文件intunzGoToFirstFile(void*uf)输入参数:1)文件流指针;返回值:1)0成功,2)-1失败。API4:打开当前文件intunzOpenCurrentFilePassword(void*uf,char*pwd)输入参数:1)文件流指针,2)密钥(网站加密压缩ZIP时的密钥),返回值:1)0成功,2)-1失败。API5:读取当前文件内容intunzReadCurrentFile(void*uf,char*buf,size_tsize)输入参数:1)文件流指针,2)读取内容,3)内容大小;返回值:1)0成功,2)-1失败。API6:关闭当前文件intunzCloseCurrentFile(void*uf)输入参数:1)文件流指针;返回值:1)0成功,2)-1失败。API7:定位到下一个文件intunzGoToNextFile(void*uf)输入参数:1)文件流指针;返回值:1)0成功,2)-1失败。API8:关闭文件流intunzClose(void*uf)输入参数:1)文件流指针;返回值:1)0成功,2)-1失败。API9:逆向列混淆voidcontrary_mixColumns(unsignedchar*col)输入参数:1)处理数据(ZIP包中文件的内容);返回值:1)混淆处理后的数据。API10:逆向字节替换voidcontrary_subBytes(unsignedchar*col)输入参数:1)处理数据(ZIP包中文件的内容);返回值:1)逆向字节替换处理后的数据。API11:逆向行移位voidcontrary_shiftRows(unsignedchar*col)输入参数:1)处理数据(ZIP包中文件的内容);返回值:1)逆向行移位处理后的数据。API12:轮密钥加voidadd_roundKey(unsignedchar*col,unsignedchar*key,intround)输入参数:1)处理数据(ZIP包中文件的内容),2)密钥(网站加密压缩ZIP时的密钥),3)轮询次数;返回值:1)轮密钥加处理后的数据。本发明分别使用7zip和Zlib对网站上报数据进行解压测试,测试得到的时间单位为微秒,如下面表1所示;并对解压结果进行分析对比,如图6所示,该图的横坐标表示不同文件,纵坐标表示解压所用的时间。表1.测试结果列表文件名/解压方法7zip(us)Zlib(us)data_1471449694.zip6177002922data_1471453015.zip2563643209data_1471453608.zip1831815564data_1471451806.zip1931806083data_1471450007.zip16939118622data_1471450907.zip25013415472data_1471452105.zip18023136974data_1471451507.zip18455315633data_1471450307.zip2069647315从图6可得出结论,采用本发明的方法,应用Zlib库进行解压,其在时间级上远远优于采用7zip库进行解压。以上实施例仅用以说明本发明的技术方案而非对其进行限制,本领域的普通技术人员可以对本发明的技术方案进行修改或者等同替换,而不脱离本发明的精神和范围,本发明的保护范围应以权利要求书所述为准。当前第1页1 2 3 
当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1