一种抗最长匹配检测的压缩文件数据嵌入方法及装置转让专利

申请号 : CN201510192431.7

文献号 : CN104811209B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 谭毓安梁晨李元章张师玮张全新周佳琪

申请人 : 北京理工大学

摘要 :

本发明涉及一种抗最长匹配检测的压缩文件数据嵌入方法及装置,属于数据安全技术领域。本发明方法通过修改deflate压缩算法的最优匹配长度搜索过程来嵌入隐藏信息,使得最长匹配检测手段无法检测出压缩文件中是否含有隐藏信息;具体是通过修改deflate源代码最长匹配过程,利用嵌入数据控制匹配长度产生过程,使算法产生的含嵌入数据的匹配长度符合最长匹配条件,从而无法被抗最长匹配检测手段获知压缩文件是否含有隐藏信息。对比现有基于LZW压缩算法的数据嵌入方法,本发明利用隐藏数据控制压缩算法的最长匹配长度搜索过程而不是直接对搜索得到的最长匹配长度进行修改,使得最长匹配检测方法不能检测出嵌入数据是否存在。

权利要求 :

1.一种抗最长匹配检测的压缩文件数据嵌入方法,其特征在于,包括以下步骤:A.将待嵌入数据转化成二进制序列;

B.Deflate压缩算法根据压缩指令获得压缩等级,并根据压缩等级获得对应的最佳匹配长度信息;

C.Deflate压缩算法找出滑动窗口中具有与当前待编码的若干字符相同哈希值的地址并构建链表;

D.算法调用最长匹配函数,依次对链表内存储的地址计算出各匹配长度;

E.对计算出的匹配长度与嵌入数据进行对比,符合条件则以当前匹配长度替换最长匹配长度,使最后得到的最大匹配长度含有隐藏信息,遍历链表后若最长匹配长度与初始值相等或者大于最佳匹配长度,说明数据嵌入失败,此时待嵌入数据指针不向后移动,等待下一次计算匹配长度时再嵌入;否则,待嵌入数据指针向后移动;

F.函数返回最大匹配长度,若最大匹配长度与初始值相等则算法会输出当前待压缩位置的单字节内容,否则算法记录下[最大匹配长度,偏移量]对;

G.滑动窗口向后移动最大匹配长度距离,重复C—F继续下一轮压缩,直到压缩结束;

所述最佳匹配长度是deflate算法为了提高算法计算效率而引入的一种与压缩等级有关的常量。

2.根据权利要求1所述的一种抗最长匹配检测的压缩文件数据嵌入方法,其特征在于,步骤E中判断符合条件的具体做法是在每次计算出来的匹配长度与最长匹配长度进行比较、替换时,除了当前的匹配长度大于最长匹配长度之外,还要加入如下条件:当前待嵌入数据(比特)与匹配长度与1按位与相同。

3.一种抗最长匹配检测的压缩文件嵌入数据还原方法,其特征在于,包括以下步骤:A.对压缩文件进行解压,调用deflate解压算法,获得压缩文件的压缩等级并根据压缩等级获得对应的最佳匹配长度值;

B.deflate压缩文件中的数据以Huffman编码的形式存在,根据压缩数据Huffman编码头的第二、三字节可以判断该解压数据为何种形式,之后根据Huffman编码表将Huffman编码转换为对应的待解压对象,若当前待解压对象为[最大匹配长度,偏移量]对且最大匹配长度小于等于最佳匹配长度值,且最大匹配长度大于初始值,则判定该最大匹配长度含有嵌入数据;

C.将该最大匹配长度与1按位与可还原出其中隐藏的嵌入数据;

D.继续解压重复B—C直到整个压缩文件解压完毕,此时可将所有的嵌入数据还原出来。

4.一种抗最长匹配检测的压缩文件数据嵌入装置,其特征在于,包括嵌入数据获取单元、待压缩文件数据获取单元、链表处理单元、最长匹配长度计算单元、最长匹配长度输出单元;待压缩文件数据获取单元与链表处理单元相连,链表处理单元和嵌入数据获取单元分别与最长匹配长度计算单元相连,最长匹配长度计算单元与最长匹配长度输出单元相连;

所述嵌入数据获取单元用于获取当前待嵌入数据供数据嵌入时使用;

所述待压缩文件数据获取单元用于获取待压缩文件数据供数据压缩以及数据嵌入时使用;

所述链表处理单元用于对所述待压缩文件数据获取单元得到的待压缩数据生成当前待压缩位置的匹配地址链表并遍历链表将匹配地址传给所述最长匹配长度计算单元;

所述最长匹配长度计算单元用于对从所述链表处理单元获得的链表地址进行与当前压缩位置的最长匹配字符串长度计算,并根据所述嵌入数据获取单元得到的待嵌入数据控制整个链表最长匹配长度产生过程;

所述最长匹配长度输出单元用于将所述最长匹配长度计算单元产生的最长匹配长度字符串的相关信息输出,以供文件压缩的进行。

5.根据权利要求4所述的一种抗最长匹配检测的压缩文件数据嵌入装置,其特征在于,所述根据所述嵌入数据获取单元得到的待嵌入数据控制整个链表最长匹配长度产生过程是根据权利要求1所述的一种抗最长匹配检测的压缩文件数据嵌入方法步骤E进行。

6.一种抗最长匹配检测的压缩文件嵌入数据提取装置,其特征在于,包括依次连接的解压缩数据获取单元、最长匹配长度获取单元、嵌入数据还原单元、嵌入数据输出单元;

所述解压缩数据获取单元用于获取当前待解压数据供所述最长匹配长度获取单元使用;

所述最长匹配长度获取单元用于提取已获得的待解压数据中的[最大匹配长度,偏移量]对,获取其中符合最大匹配长度小于最佳匹配长度值的最大匹配长度供所述嵌入数据还原单元使用;

所述嵌入数据还原单元用于将获取的最大匹配长度进行按位与1与操作获得原嵌入数据的二进制比特序列供所述嵌入数据输出单元使用;

所述嵌入数据输出单元用于将获得的嵌入数据二进制比特序列还原成嵌入数据并输出到预定位置。

7.根据权利要求6所述的一种抗最长匹配检测的压缩文件嵌入数据提取装置,其特征在于,所述预定位置为电子文件、显示终端或打印终端。

说明书 :

一种抗最长匹配检测的压缩文件数据嵌入方法及装置

技术领域

[0001] 本发明涉及一种抗最长匹配检测的压缩文件数据嵌入方法及装置,特别涉及一种基于deflate数据压缩算法的抗最长匹配检测的压缩文件数据嵌入方法及装置,属于数据安全技术领域。

背景技术

[0002] 数据压缩是在不丢失有用信息的条件下,以较短的数据编码来代替原数据,从而减少数据的存储空间的技术。在当前的信息数据量指数级增长的网络大环境下,减少数据的存储空间对降低数据管理难度,减少数据传输代价等等具有必不可少的作用。
[0003] 数据压缩算法可分为无损数据压缩与有损数据压缩,无损压缩利用数据的统计冗余进行压缩,不存在信息损失,数据经过压缩之后能够从压缩数据当中准确的恢复出原数据,这使得无损压缩的正确率要高得多,这种压缩方法通常使用于文本压缩当中。而有损压缩则会造成数据信息的一些丢失,这种压缩使得压缩后数据的大小显著小于使用无损压缩,因此,倘若可以接收一定程度的信息丢失,则有损压缩是一种十分高效的压缩方法。有损压缩常常用于语音以及视频压缩当中。
[0004] Lempel-Ziv压缩方法是由Abraham Lempel和Jacob Ziv于1977-1978年提出的一类十分经典的无损数据压缩方法,其中的核心算法是LZ77和LZ78算法。在这两种算法的基础之上后来又派生出了许多其他算法并被普遍使用于各种压缩软件当中。
[0005] LZW算法(Lempel-Ziv-Welch)由LZ78算法改进而来,其基本原理是在压缩以及解压过程中逐渐生成一个静态字典,利用该静态字典进行编码,从而生成压缩编码序列。具体压缩过程是在当前待编码位置对压缩字典进行搜索,将搜索得到的最长匹配字符串对应的索引值输出,并且将最长匹配字符串与邻接的下一个字符连接起来组成新的字符串加入字典索引。LZW算法流程如图1所示。
[0006] Deflate算法是一种LZ77算法的改良算法,基于LZ77算法与Huffman熵编码,其算法流程如图2所示。LZ77算法通过使用编码器或者解码器中已经出现过的相应匹配数据信息替换当前数据从而实现压缩功能。这个匹配信息使用称为长度-距离对的一对数据进行编码,它等同于“每个给定长度个字符都等于后面特定距离字符位置上的未压缩数据流。”Deflate算法在此基础之上加入了一些改动使得其性能较LZ77有了很大进步。
[0007] 数据嵌入是一种信息隐藏技术,所谓信息隐藏技术是指将秘密信息嵌入到数字化载体当中,其目标不仅仅是通过与密码学结合来对秘密信息进行加密,更重要的是让隐藏的密码信息及其载体不会引起非法者的注意,也就减少了含秘数字载体被攻击的风险。正是基于数据 压缩与信息隐藏的相关知识基础之上才诞生了压缩文件数据嵌入方法。
[0008] 目前流行的压缩文件数据嵌入方法大多是基于LZW压缩算法之上的。已有的LZW算法的数据嵌入方法通常是根据待嵌入比特值来对算法产生的最长字符串长度进行修改,使产生的字符串当中蕴含隐藏信息,解压时可以据此来还原嵌入数据。然而由于这类数据嵌入方法在嵌入过程当中对产生的字符串长度进行了直接修改,导致破坏了算法本身的匹配规律,对手很有可能利用长度检测的方法来识别出压缩文件当中是否含有隐藏信息,进而对其进行破解,这为数据嵌入的安全性留下了隐患。
[0009] 最长匹配检测技术是基于已有的LZW压缩算法数据嵌入方法产生的一种检测方法,能够检测出压缩文件中是否含有嵌入数据,进而可以使用相应的数据还原方法将嵌入数据还原出来。其基本方法流程为:
[0010] 步骤一:获取压缩文件编码,将之还原为对应的字符或字符串;
[0011] 步骤二:对还原出的字符串,取首字符连接到前一个还原出来的字符或字符串末端组成新的字符串;对还原出来的字符,取该字符连接到前一个还原出来的字符或字符串末端组成新的字符串;
[0012] 步骤三:对步骤二中得到的新的字符串,在算法已经生成的字典当中寻找匹配,若找到字典中已经存在相同的字符串则检测出该压缩文件含有嵌入数据;
[0013] 步骤四:对整个压缩文件进行遍历,只要出现满足步骤三当中的现象即说明存在嵌入数据,否则说明该文件不存在嵌入数据;

发明内容

[0014] 针对上述缺陷,本发明的内容是提出一种抗最长匹配检测的压缩文件数据嵌入方法。
[0015] 由于在数据压缩过程中每次生成的最长匹配字符串是唯一的,原有的LZW压缩算法数据嵌入算法总是着手对最长匹配字符串长度的修改使其嵌入隐藏数据,因此执行嵌入数据过程中必定会导致原匹配字符串长度发生改变,这为长度检测算法能够检测出嵌入数据创造了条件。想要实现抗长度检测必须要满足在不改变已生成的字符串长度的情况下进行数据嵌入。
[0016] LZ77算法的压缩原理是在滑动窗口中搜索得到若干匹配字符串,分别计算其最大匹配长度,再将其中最长匹配字符串所对应的[长度,偏移量,下一个字符]对输出,以此来进行数据压缩。由于在搜索过程中字典为动态字典,其内容不断发生变化并且匹配过程产生的最长匹配字符串一般来讲有多个,这就为本发明数据嵌入创造了条件。Deflate算法是基于LZ77算法的改进算法,将匹配字符串的输出对减少为[长度,偏移量],从而提高了压缩算法效率。并且由于deflate算法中采用Huffman编码,使得对手想直接利用最长匹配检测算法增加了复杂度从而提高了安全性,本发明中选择Deflate算法作为数据嵌入算法。算法数据嵌入流程如图3所示。
[0017] 本发明是通过以下技术方案实现的:
[0018] 一种抗最长匹配检测的压缩文件数据嵌入方法,包括以下步骤:
[0019] A.将待嵌入数据转化成二进制序列;
[0020] B.Deflate压缩算法根据压缩指令获得压缩等级,并根据压缩等级获得对应的最佳匹配长度信息;
[0021] C.Deflate压缩算法找出滑动窗口中具有与当前待编码的若干字符相同哈希值的地址并构建链表;
[0022] D.算法调用最长匹配函数,依次对链表内存储的地址计算出各匹配长度;
[0023] 最长匹配函数的返回值为最长匹配字符串的长度,链表内存放的每个地址都会计算出一个匹配长度;
[0024] E.对计算出的匹配长度与嵌入数据进行对比,符合条件则以当前匹配长度替换最长匹配长度,使最后得到的最大匹配长度含有隐藏信息,遍历链表后若最长匹配长度与初始值相等或者大于最佳匹配长度,说明数据嵌入失败,此时待嵌入数据指针不向后移动,等待下一次计算匹配长度时再嵌入;否则,待嵌入数据指针向后移动;
[0025] F.函数返回最大匹配长度,若最大匹配长度与初始值相等则算法会输出当前待压缩位置的单字节内容,否则算法记录下[最大匹配长度,偏移量]对;
[0026] G.滑动窗口向后移动最大匹配长度距离,重复C—F继续下一轮压缩,直到压缩结束。
[0027] 步骤B中的最佳匹配长度是deflate算法为了提高算法计算效率而引入的一种与压缩等级有关的常量。当算法遍历哈希链表时,一旦 某链表结点产生的匹配字符串长度大于最佳匹配长度则不再继续访问该节点之后的链表,这样使文件压缩后大小变大,但大大降低了算法计算的时间,是一种通过牺牲空间来成本换取时间减少的手段。
[0028] 步骤E中所述判断是否符合条件的具体做法是在每次计算出来的匹配长度与最长匹配长度进行比较、替换时,除了当前的匹配长度大于最长匹配长度之外,还要加入如下条件:当前待嵌入数据(比特)与匹配长度与1按位与相同。
[0029] 一种抗最长匹配检测的压缩文件嵌入数据还原方法,包括以下步骤:
[0030] A.对压缩文件进行解压,调用deflate解压算法,获得压缩文件的压缩等级并根据压缩等级获得对应的最佳匹配长度值;
[0031] B.deflate压缩文件中的数据以Huffman编码的形式存在,根据压缩数据Huffman编码头的第二、三字节可以判断该解压数据为何种形式,之后根据Huffman编码表将Huffman编码转换为对应的待解压对象,若当前待解压对象为[最大匹配长度,偏移量]对且最大匹配长度小于等于最佳匹配长度值大于初始值,则判定该最大匹配长度含有嵌入数据;
[0032] C.将该最大匹配长度与1按位与可还原出其中隐藏的嵌入数据;
[0033] D.继续解压重复B—C直到整个压缩文件解压完毕,此时可将所有的嵌入数据还原出来。
[0034] 一种抗最长匹配检测的压缩文件数据嵌入装置,包括嵌入数据获取单元、待压缩文件数据获取单元、链表处理单元、最长匹配长度计算单元、最长匹配长度输出单元;待压缩文件数据获取单元与链表处理单元相连,链表处理单元和嵌入数据获取单元分别与最长匹配长度计算单元相连,最长匹配长度计算单元与最长匹配长度输出单元相连;
[0035] 所述嵌入数据获取单元用于获取当前待嵌入数据供数据嵌入时使用;
[0036] 所述待压缩文件数据获取单元用于获取待压缩文件数据供数据压缩以及数据嵌入时使用;
[0037] 所述链表处理单元用于对所述待压缩文件数据获取单元得到的待压缩数据生成当前待压缩位置的匹配地址链表并遍历链表将匹配地址传给所述最长匹配长度计算单元;
[0038] 所述最长匹配长度计算单元用于对从所述链表处理单元获得的链表地址进行与当前压缩位置的最长匹配字符串长度计算,并根据所述嵌入数据获取单元得到的待嵌入数据控制整个链表最长匹配长度产生过程;
[0039] 所述最长匹配长度输出单元用于将所述最长匹配长度计算单元产生的最长匹配长度字符串的相关信息输出,以供文件压缩的进行。
[0040] 所述根据所述嵌入数据获取单元得到的待嵌入数据控制整个链表最长匹配长度产生过程是根据所述抗最长匹配检测的压缩文件数据嵌入方法步骤D进行。
[0041] 一种抗最长匹配检测的压缩文件嵌入数据提取装置,包括依次连接的解压缩数据获取单元、最长匹配长度获取单元、嵌入数据还原单元、嵌入数据输出单元;
[0042] 所述解压缩数据获取单元用于获取当前待解压数据供所述最长匹配长度获取单元使用;
[0043] 所述最长匹配长度获取单元用于提取已获得的待解压数据中的[最大匹配长度,偏移量]对,获取其中符合最大匹配长度小于最佳匹配长度值的最大匹配长度供所述嵌入数据还原单元使用;
[0044] 所述嵌入数据还原单元用于将获取的最大匹配长度进行按位与1与操作获得原嵌入数据的二进制比特序列供所述嵌入数据输出单元使用;
[0045] 所述嵌入数据输出单元用于将获得的嵌入数据二进制比特序列还原成嵌入数据并输出到预定位置。
[0046] 所述预定位置为电子文件、显示终端或打印终端。
[0047] 有益效果
[0048] 本发明利用隐藏数据控制压缩算法的最长匹配长度搜索过程而不是直接对搜索得到的最长匹配长度进行修改,使得最长匹配检测方法不能检测出嵌入数据是否存在。

附图说明

[0049] 图1为LZW算法压缩流程示意图;
[0050] 图2为deflate算法压缩流程示意图;
[0051] 图3为本发明方法的数据嵌入过程示意图;
[0052] 图4为本发明方法的压缩文件数据嵌入装置结构示意图;
[0053] 图5为本发明方法的压缩文件嵌入数据提取装置结构示意图;
[0054] 图6为本发明方法的数据嵌入过程详细流程示意图;
[0055] 图7为zlib 1.2.8源代码压缩包下载列表;
[0056] 图8为本实例待嵌入数据文本内容。

具体实施方式

[0057] 为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明的一种抗最长匹配检测的压缩文件数据嵌入方法进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。
[0058] 下面将按照发明内容所介绍的步骤,详细介绍各个步骤的具体实施方式。
[0059] 实施例1
[0060] 本实施例使用支持deflate算法的zlib压缩解压缩库,完成deflate算法在快速模式下的数据嵌入。zlib是提供资料压缩之用的函式库,由Jean-loup Gailly与Mark Adler所开发,初版0.9版在1995年5月1日发表。zlib使用抽象化的DEFLATE算法,最初是为libpng函式库所写的,后来普遍为许多软件所使用。此函式库为自由软件,使用zlib授权。截至2007年3月,zlib是包含在Coverity的美国国土安全部赞助者选择继续审查的开源项目。本实施例中使用zlib 1.2.8版本作为实例对象。实施例具体步骤如下:
[0061] A.获得zlib 1.2.8源代码
[0062] 可在zlib Home Site网站(http://www.zlib.net/)下载zlib 1.2.8版本的源代码。本实施例使用Windows764位操作系统,程序修改调试基于Microsoft Visual Studio 2010编译环境进行。因此,打开链接之后,找到下载页面,选择合适的版本,如图6所示,点击即可进行下载。
[0063] B.修改zlib 1.2.8源代码中deflate压缩与解压缩算法模块并重新编译。
[0064] 1.解压缩zlib并配置zlib编译环境
[0065] 将下载的zlib源代码压缩包解压到某一目录下,本实例中zlib解压路径为“D:\zlib-1.2.8”。
[0066] 安装编译环境:
[0067] 安装c++编译环境即可,本实例中编译调试环境为Microsoft Visual Studio 2010。
[0068] 2.打开zlib文件目录下的deflate.c文件,修改源代码中压缩算法的最长匹配模块代码。
[0069] 如图7所示为本发明实施例一种抗最长匹配检测的压缩文件数据嵌入方法详细流程图,包括以下内容:
[0070] (1)将待嵌入数据转化为二进制比特序列并存储于数组之中;
[0071] 待嵌入文件名称、类型、路径自行修改,读入的待嵌入数据被转换为二进制比特序列存放于指定数组之中,数组大小可视待嵌入数据大小而自行改变。
[0072] 本实例中待嵌入数据为一txt文档,如图8所示。
[0073] (2)Deflate算法实现压缩过程要调用local block_state deflate_stored(s,flush)或local block_state deflate_fast(s,flush)或local block_state deflate_slow(s,flush)等函数,具体选择哪种函数对应于选择哪种压缩方式而定,压缩方式定义源代码如下:
[0074] 压缩等级为0,调用local block_state deflate_stored(s,flush)函数;
[0075] 压缩等级1~3,调用local block_state deflate_fast(s,flush)函数;
[0076] 压缩等级4~9,调用local block_state deflate_slow(s,flush)函数;
[0077] 三种压缩函数中:
[0078] local block_state deflate_stored(s,flush)函数无匹配过程,因而无法进行数据嵌入;
[0079] local block_state deflate_slow(s,flush)函数由于采用懒惰匹配,懒惰匹配是指对于当前字节开始的串,当搜索到最长匹配之后,算法并不立即决定使用这个串进行替换。而是先判断这个匹配长度是否满意(len>=nice_match),若匹配长度不满意,而下一个字节开始的串也有匹配串的话,则算法将对下一个字节开始的串搜索最长匹配,搜索结果匹配长度是否优于当前最长匹配。可见嵌入数据会因最长匹配长度的丢失而缺失,故在压缩等级4~9时也不宜直接实现数据嵌入。
[0080] local block_state deflate_fast(s,flush)函数会在压缩过程直接调用名为longest_match(s,cur_match)函数来返回最长匹配字符串,因此可对longest_match(s,cur_match)函数进行修改来完成数据嵌入;
[0081] (3)根据嵌入数据对longest_match(s,cur_match)函数进行修改;
[0082] 修改后的longest_match(s,cur_match)函数部分代码如下:
[0083]
[0084] (4)local block_state deflate_fast(s,flush)函数调用longest_match(s,cur_match)函数获得最大匹配长度,并通过调用其他函数计算出最大匹配长度字符串到当前压缩位置的偏移量,记录下[最大匹配长度,偏移量]对;
[0085] (5)压缩位置指针向后移动最大匹配长度距离,继续循环直到到达文件末尾完成压缩。
[0086] 3.打开zlib文件目录下的inflate.c文件,修改源代码中解压模块代码。
[0087] (1)解压算法调用int ZEXPORT inflate(strm,flush)函数获得压缩文件信息(包括压缩文件的压缩等级以及根据压缩等级获得的对应的最佳匹配长度值)并对压缩文件进行解压;
[0088] (2)保存解压算法每次读取的[最大匹配长度,偏移量]对,本实施例中使用printf函数实现;
[0089] (3)重复(1)-(2)直到压缩文件解压完毕;
[0090] (4)遍历(2)中获得的[最大匹配长度,偏移量]对,若最大匹配长度小于最佳匹配长度,则将最大匹配长度与1按位与后得到的末位比特数据记录下来得到还原的嵌入数据比特序列;
[0091] (5)将嵌入数据比特序列按8位一组还原成对应的字节后写入指定位置即可得到还原的嵌入数据。
[0092] 所述指定位置可以为用户指定的磁盘文件、显示终端或者打印终端。
[0093] 4.修改代码完成后,重新编译zlib;
[0094] C.利用cmd命令行实现压缩文件数据嵌入以及提取过程
[0095] 1.打开cmd.exe;
[0096] 2.将命令行路径指向“D:\zlib-1.2.8\debug”;
[0097] 3.cmd命令行下输入压缩命令“gzlib-f obama.txt”实现对指定文件的压缩以及数据嵌入,其中“gzlib-f”表示压缩命令,待压缩文件可以 为当前路径下的任意文件,本实例中使用文本文件obama.txt,大小为13504字节作为压缩文件测试对象;
[0098] 作为优选,待嵌入数据亦可以作为参数传给压缩算法,实现对指定文件数据的嵌入。
[0099] 4.cmd命令行下输入解压命令“gzlib.exe-d obama.txt.gz 1>d:\a.txt”对指定压缩文件进行解压,同时实现嵌入数据的提取还原,还原出来的嵌入数据被写入d:\a.txt中。该解压命令可在zlib源代码minigzip.c文件中找到详细说明。
[0100] 5.将还原出来的二进制比特序列还原为嵌入数据文件时,每8位转换为1字节数据,当还原数据遇到文件结尾标志则停止还原,即可获得原嵌入数据。
[0101] 本发明方法通过控制deflate压缩算法的最长匹配长度搜索过程而不是直接对搜索结果得到的最长匹配长度进行处理,这种通过基于deflate数据压缩算法的压缩文件数据嵌入方法产生的匹配字符串均符合最长匹配规则。因此这种数据嵌入方法能够实现抗最长匹配检测功能。
[0102] 本领域的技术人员从上面描述的内容可以了解,本发明方法各步骤间没有严格的先后关系,只要一个步骤的实现不需要依赖另一个步骤的完成,就可根据实际情况调整顺序,如步骤A、B和步骤C。
[0103] 实施例2
[0104] 如图4所示为抗最长匹配检测的压缩文件数据嵌入装置,包括嵌入数据获取单元、待压缩文件数据获取单元、链表处理单元、最长匹配长度计算单元、最长匹配长度输出单元;待压缩文件数据获取单元与链表处理单元相连,链表处理单元和嵌入数据获取单元分别与最长匹配长度计算单元相连,最长匹配长度计算单元与最长匹配长度输出单元相连;
[0105] 嵌入数据获取单元:获取嵌入数据,并将嵌入数据转换为二进制比特序列存放于bitBuf数组当中,将bitBuf数组定义为为全局数组,数据嵌入时直接访问bitBuf数据即可获取待嵌入数据;
[0106] 待压缩文件数据获取单元:获取当前待压缩文件数据,这一功能由local block_state deflate_fast(s,flush)函数实现,该函数会在压缩算法开始新一轮压缩时获取当前待压缩数据位置指针,待压缩数据位置指针被存储于strstart变量中供数据压缩以及数据嵌入使用;
[0107] 链表处理单元:生成当前待压缩位置的匹配地址链表,具体通过调用int ZEXPORT deflateSetDictionary(strm,dictionary,dictLength)函数生成;遍历链表将匹配地址传给所述最长匹配长度计算单元,具体通过longest_match(s,cur_match)函数中的while((cur_match=prev[cur_match&wmask])>limit&&--chain_length!=0)这一循环控制条件完成;cur_match变量中存储当前匹配地址;
[0108] 最长匹配长度计算单元:对所述链表地址进行与当前压缩位置的最长匹配字符串长度计算,并根据所述嵌入数据获取单元得到的待嵌入数据控制整个链表最长匹配长度产生过程;
[0109] 所述根据所述嵌入数据获取单元得到的待嵌入数据控制整个链表最长匹配长度产生过程是根据所述抗最长匹配检测的压缩文件数据嵌入方法步骤D进行。
[0110] 最长匹配长度输出单元:将最长匹配长度计算单元产生的最长匹配长度字符串的相关信息输出,以供文件压缩的进行。
[0111] 如图5所示为抗最长匹配检测的压缩文件嵌入数据提取装置,依次连接的解压缩数据获取单元、最长匹配长度获取单元、嵌入数据还原单元、嵌入数据输出单元;
[0112] 解压缩数据获取单元:获取当前待解压数据,具体由解压函数int ZEXPORT inflate(strm,flush)实现;
[0113] 最长匹配长度获取单元:获取最大匹配长度小于最佳匹配长度值的最大匹配长度并将其输出至指定位置;
[0114] 嵌入数据还原单元:遍历最长匹配长度获取单元输出的最大匹配长度并按位与1与即可获得原嵌入数据的二进制比特序列,供嵌入数据输出单元使用;
[0115] 嵌入数据输出单元:将获得的嵌入数据二进制比特序列按8位一组还原成对应的字节并输出到预定位置,此过程与嵌入数据转换为二进制比特序列互为逆过程,可参照嵌入数据转换为二进制比特序列过 程实现。若转换过程遇到文件结尾标志时停止转换,至此可获得原嵌入数据文件。
[0116] 以上所述的具体描述,对发明的目的、技术方案和有益效果进行了进一步详细说明,所应理解的是,以上所述仅为本发明的具体实施例而已,并不用于限定本发明的保护范围,凡在本发明的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。