APP下载

基于一阶贝塞尔曲线的信息隐藏软件的设计

2015-07-13吴琦

电脑知识与技术 2015年13期

吴琦

摘要:该文探讨了基于一阶贝塞尔曲线的信息融合算法,并在理论上证明了该算法的可用性;同时对该算法的相应部分进行了改进,并编程实现了载体图像文件对信息的隐藏和恢复功能;通过测试与分析,所开发的软件可以无损地对数据流信息进行隐藏和恢复。

关键词:信息隐藏技术;图像空域;一阶贝塞尔曲线;隐藏比例;位图

中图分类号:TP18 文献标识码:A 文章编号:1009-3044(2015)13-0112-02

Abstract: This paper focuses on the fusion algorithm based on the information of first order Bessel curve, and proves the availability of the algorithm in theory; secondly, the corresponding part of the algorithm is improved, and the programming of information hiding and restore function; finally, through the test and analysis, the development the software can be non-destructive to the data flow information hiding and recovering.

Key words: Information hiding; image; the first order Bessel curve; hidden proportion; bitmap

1 基于一阶贝塞尔曲线的信息隐藏软件的需求分析

通过对24位BMP位图文件的空域研究,并且运用一阶贝塞尔曲线算法,在程序上实现了对机密信息的隐藏和恢复的功能。在算法的原有基础上,首先进行了对嵌入算法和恢复算法两大模块的程序改进,使其对组帧过程中微小的差错进行严格的检验。并且在理论上运用数学基础确定了算法中起关键作用的相关参数,使得最终隐藏比率达到3/8,即宿主文件可容纳占其大小3/8的机密信息,同时保证融合后宿主文件的大小、类型、形态不变,同时隐藏信息能够成功的恢复出来。因此通过本软件的使用,更有效的加大了信息隐藏的数据量,而且进一步确保了重要信息的安全性,将其安全的融合到24位BMP位图文件中,提高其保密程度。

2 基于一阶贝塞尔曲线的信息隐藏软件的设计方案

2.1 对明文组帧

核心算法的理论证明是正确和有效的,通过对其实现过程,以及测试实际应用效果的算法。包括两个模块:提取文件和文件。在秘密档案(明文)隐藏到位图文件(主机信息)时,首先通过CFile类打开()函数,它的内容读入内存,和信息的秘密文件,如文件名,文件访问为了提取文件的长度也可提取的信息存储在隐藏状态的位图。因为文件名不允许“*”,它可以作为一个单独的文件的信息符号,通过一定的数据帧格式:

//对明文进行组帧

for(int k=0;k

HideData[k]=InfoHead.GetAt(k);

HideFile.Read(HideData+HeadLen,HideFileLen); //文件内容

for (DWORD kk=HeadLen+HideFileLen;kk

HideData[kk]=0; //空余内容以0填充

2.2嵌入算法

组帧完毕后,根据T = 0.035、L = 3算法进行信息流的融合处理。因为它是一个8位的图像信息隐藏3比特的秘密文件的信息,所以最小公倍数24位(3字节)为一个周期。比特流划分可用比特和移位运算来实现,三字节的掩模的秘密文件是在[ 224,28,3 ]命令,[ 128112,14,1 ],[ 192,56,7 ],应相应的移位操作。本代码是核心代码隐藏文件,直接反映了该算法的中心思想:

for(DWORD i=54;i

{Temp=((HideData[j]&224)>>5)<<5; //第一个“3比特”构成图像的第一字节

BaseData[i]=HideCalculate(BaseData[i],Temp); //进行两文件融合计算

i++; //修正宿主信息当前指针(字节为单位)

Temp=((HideData[j]&28)>>2)<<5; //第二个“3比特”构成图像的第二字节

BaseData[i]=HideCalculate(BaseData[i],Temp);

i++;

Temp=(HideData[j]&3)<<1; //第三个“3比特”

j++; //修正隐藏信息当前指针(字节为单位)

Temp|=(HideData[j]&128)>>7;

Temp*=32;

BaseData[i]=HideCalculate(BaseData[i],Temp);

i++;

Temp=((HideData[j]&112)>>4)<<5; //第四个“3比特”

BaseData[i]=HideCalculate(BaseData[i],Temp);

i++;

Temp=((HideData[j]&14)>>1)<<5; //第五个“3比特”

BaseData[i]=HideCalculate(BaseData[i],Temp);

i++;

Temp=(HideData[j]&1)<<2; //第六个“3比特”

j++;

Temp|=(HideData[j]&192)>>6;

Temp*=32;

BaseData[i]=HideCalculate(BaseData[i],Temp);

i++;

Temp=((HideData[j]&56)>>3)<<5; //第七个“3比特”

BaseData[i]=HideCalculate(BaseData[i],Temp);

i++;

Temp=(HideData[j]&7)<<5; //第八个“3比特”

BaseData[i]=HideCalculate(BaseData[i],Temp);

j++;}

其中,在无符号字符hidecalculate计算图像融合(unsigned char、unsigned char B,H)功能来完成。B参数的主机信息内容,H是隐藏信息的内容。在计算完成后将合并信息实现功能的代码,如下:

unsigned char CDataHiderView::HideCalculate(unsigned char B, unsigned char H)

{// f2=round(f0*(1-t))+round(f1*t)

unsigned char R=(int)((1-t)*B+0.5f)+(int)(t*H+0.5f);

return R;}

2.3恢复算法

从位图文件提取过程实际上是一个隐藏文件的逆过程。将包含一个隐藏文件的位图和原始位图的读取到缓冲区中,从每个字节的信息获取主机的3位中提取的信息,然后根据8位/字节格式由一个流的字节序列的比特流,以恢复隐藏的信息:

for(DWORD i=54;i

{Temp=(ShowCalculate(CarrierData[i],BaseData[i])&7)<<5;//提取出第一个“3比特”

i++; //宿主信息指针修正(字节为单位)

Temp|=(ShowCalculate(CarrierData[i],BaseData[i])&7)<<2; //提取出第二个“3比特”

i++;

Temp|=(ShowCalculate(CarrierData[i],BaseData[i])&6)>>1; //提取出第三个“3比特”

CarrierData[j]=Temp; //恢复出第一个隐藏字节

j++; //隐藏信息指针修正(字节为单位)

Temp=(ShowCalculate(CarrierData[i],BaseData[i])&1)<<7;

i++;

Temp|=(ShowCalculate(CarrierData[i],BaseData[i])&7)<<4; //提取出第四个“3比特”

i++;

Temp|=(ShowCalculate(CarrierData[i],BaseData[i])&7)<<1; //提取出第五个“3比特”

i++;

Temp|=(ShowCalculate(CarrierData[i],BaseData[i])&4)>>2; //提取出第六个“3比特”

CarrierData[j]=Temp; //恢复出第二个隐藏字节

j++;

Temp=(ShowCalculate(CarrierData[i],BaseData[i])&3)<<6;

i++;

Temp|=(ShowCalculate(CarrierData[i],BaseData[i])&7)<<3; //提取出第七个“3比特”

i++;

Temp|=ShowCalculate(CarrierData[i],BaseData[i])&7; //提取出第八个“3比特”

CarrierData[j]=Temp; //恢复出第三个隐藏字节

j++;}

这是恢复和纠错信息的主要工作是在unsigned char showcalculate(unsigned char、unsigned char c,b)功能来完成。为主机信息内容C参数,参数的原始信息内容,返回值是3位隐藏信息(未转移):

unsigned char CDataHiderView::ShowCalculate(unsigned char C, unsigned char B)

{// rf1=round((f2-round((1-t)*f0))/t)

unsigned char R=(int)((C- (int)((1-t)*B+0.5f))/t+0.5f);

if(R%32>15) //误差修正(自动纠错)

R+=15;

R=(int)(R/32.0f+0.5f);

return R;}

经过以上处理,文件的信息和内容可以被隐藏的文件恢复从主机内存位图剩下的工作,不仅要恢复的文件头格式文件的相关信息进行提取,然后将文件内容保存到磁盘完成任何二进制文件。

3 基于一阶贝塞尔曲线的信息隐藏软件的实现

3.1基本步骤

软件的实现主要为宿主文件的正确选取,待隐藏文件的正确选取,融合过程的成功进行,融合后文件的正确选取,恢复过程的成功进行五部分。实现步骤如图1,而其间各种程序的实现也同步进行。首先选择非空BMP位图文件作为宿主文件,因为此软件所选定的宿主文件类型仅为24位BMP位图文件,而大小为0kb的文件不能作为宿主文件使用,同时软件也会提示宿主文件选取错误;当选取待隐藏文件时,各种文件类型均可选取,如.txt文本文件类型、.exe执行文件类型以及各种图像文件类型。若选取的文件过大,超过宿主文件大小的3/8,软件在融合步骤将会提示待隐藏文件大小过大。因此本软件更适合隐藏容量较小的图像文件和文本文件;融合过程的成功进行取决于融合系数的选择,组帧部分的实现如图2所示,融合过程的成功进行取决于融合系数的选择,组帧完毕后将按照参数t=0.035、L=3对组帧后的信息进行融合。一般情况下,融合系数和串长参数在软件原有程序中已确定。融合时,软件提示融合后文件的储存地址,在此要注意为融合后的文件作标记,并确定路径;恢复文件时,必须正确选取融合后的文件,否则软件会提示选取文件有误。恢复过程是融合过程的逆过程,按照组帧信息,确保机密文件的完整性和正确性。同时软件会提示机密文件的储存位置。

3.2错误判断

当在进行数据隐藏及恢复过程中,难免会发生一些错误。对于相应错误,软件经过判断,都会给出相应的错误提示框,告诉用户正确的操作。

当选择宿主文件时,假如选择的宿主文件不为BMP文件,软件会提示“宿主文件格式错误”;即使是BMP文件格式,但并非24位,软件将会提示“位图文件应为24位”;而当选择了字节为0kb的24位BMP文件时,提示为“此文件不能用于隐藏数据”。

待隐藏文件选择后,当点击嵌入数据按钮时,程序会自动判断待隐藏文件大小是否小于或等于宿主文件大小的3/8,若大于宿主文件大小的3/8时,软件会提示“隐藏文件过大”;而当恢复机密文件时,软件首先会判断所选文件是否为隐藏有机密文件的融和文件,若不是即提示“所选文件非融和文件”;假如融合文件被他人破坏,使文件标头组帧受到影响,导致文件无法恢复,软件会提示“文件被破坏无法恢复”。

3.3测试与分析

以491×363大小的24位BMP图像作为原始图像进行实验。在t=0.035、L=3时理论最大隐藏数为491×363×3×3/8=200,512字节。占位图大小536,576字节的37.368%,约为宿主图像大小的原始图像含有隐含文件的图像3/8。在一个大小为4,096的文本文件隐藏实验,隐藏位图的大小是536,576字节,然后从中恢复的成功的位图,并正常运行。实验结果表明,该隐藏算法的一阶Bézier曲线上的信息是正确和可行的,并可以实现位图位图,文本信息隐藏与恢复的位图文件类型。

4 结束语

在本文中,通过对24位BMP文件格式的认识,和基于一阶贝塞尔曲线的图像隐藏算法,二进制文件的隐藏,可以恢复正确的。此外,该算法的可靠性进行了理论上证明,然后通过软件测试分析,验证了算法的正确性。该算法可以隐藏容量。该算法可以隐藏容量高达3 / 8主机信息的能力,因此它是非常适合和保密的文件隐藏。该算法的信息隐藏软件,信息隐藏和恢复可以成功的将小于或等于主文件3 / 8的规模,预计将达到最优的结果。

参考文献:

[1] 肖诗勤,杨关良.一种改进的鱼眼图像轮廓提取算法[J]. 计算机与数字工程,2010(1).

[2] 王慧琴.数字图像处理[M].北京:北京邮电大学出版社,2006.

[3] 毕萍.图像分类方法的对比研究[J]. 现代电子技术,2009(18).

[4] 张杰,郭小川,金城,等.基于特征互补率矩阵的图像分类方法[J]. 计算机工程,2011(4).

[6] 杨淑莹. VC++图像处理程序设计[M].北京:北京交通大学出版社,2010.