3 基于一阶贝塞尔曲线的信息隐藏软件的需求分析 http://www.paper51.com 3.1 任务概述 copyright paper51.com 本实例软件主要完成通过对24位BMP位图文件的空域研究,并且运用一阶贝塞尔曲线算法,在程序上实现了对机密信息的隐藏和恢复的功能。在算法的原有基础上,首先进行了对嵌入算法和恢复算法两大模块的程序改进,使其对组帧过程中微小的差错进行严格的检验。并且在理论上运用数学基础确定了算法中起关键作用的相关参数,使得最终隐藏比率达到3/8,即宿主文件可容纳占其大小3/8的机密信息,同时保证融合后宿主文件的大小、类型、形态不变,同时隐藏信息能够成功的恢复出来。因此通过本软件的使用,更有效的加大了信息隐藏的数据量,而且进一步确保了重要信息的安全性,将其安全的融合到24位BMP位图文件中,提高其保密程度。 内容来自www.paper51.com 3.2 需求规定 copyright paper51.com 本软件必须在安装有VC++的Windows系统进行使用,在信息隐藏和恢复过程中,都由相对应的算法和程序来完成,所以硬件外部设备需要达到奔腾133以上PC机,内存需16兆以上。外部功能包括可视化界面,宿主文件的选择,存储路径的选择及待恢复文件的选择和存储路径。内部功能有信息标头的封装和其他信息的转换,便于隐藏至图像空域。 paper51.com 3.3 需求描述 copyright paper51.com 软件需求大体描述为如下:主体模块包括信息嵌入模块和信息恢复模块;功能模块包括宿主文件的正确选取,待隐藏文件的正确选取,融合过程的成功进行,融合后文件的正确选取,恢复过程的成功进行五大部分。对于用户来说,仅可以选择非空BMP位图文件作为宿主文件,因为大小为0kb的文件不能作为宿主文件使用,软件会提示宿主文件选取错误;选取待隐藏文件时,各种文件类型均可选取。若选取的文件过大,超过宿主文件大小的3/8,软件会提示待隐藏文件大小过大。因此本软件更适合隐藏容量较小的图像文件和文本文件;融合过程的成功进行取决于文件标头长度和融合系数的选择,一般情况下,文件标头对于融合过程的影响不大,而融合系数在软件原有程序中已确定;恢复文件时,需正确选取融合后的文件,否则软件会提示选取文件有误。 内容来自www.paper51.com 4 基于一阶贝塞尔曲线的信息隐藏软件的设计方案 内容来自论文无忧网 www.paper51.com
4.1 对明文组帧 paper51.com 核心算法在理论上被证明正确有效后可通过程序对其加以实现并检验算法在实际应用中的效果。实现共分两大模块:文件的隐藏和文件的提取。在把秘密文件(明文信息)隐藏到位图文件(宿主信息)中时,首先通过CFile类的Open()函数将其内容分别读取到内存,并将秘密文件的有关信息如文件名、文件长度等一并获取以便从位图提取文件时能将提取出的信息仍以隐藏前的状态保存。由于文件名不允许出现“*”号,因此可将其作为分隔文件各项信息的分隔符,并按一定格式对其组帧: 内容来自论文无忧网 www.paper51.com
//对明文进行组帧 paper51.com for(intk=0;k<HeadLen;k++) //文件头:文件名+“*”+文件长度+“*” copyright paper51.com HideData[k]=InfoHead.GetAt(k); 内容来自www.paper51.com HideFile.Read(HideData+HeadLen,HideFileLen);//文件内容 内容来自www.paper51.com for (DWORDkk=HeadLen+HideFileLen;kk<BaseFileLen;kk++) copyright paper51.com HideData[kk]=0; //空余内容以0填充 http://www.paper51.com
4.2 嵌入算法 内容来自论文无忧网 www.paper51.com
组帧完毕后,可按t=0.035、L=3时的算法进行信息流的融合处理。由于是用8比特的图像信息来隐藏3比特的秘密文件信息,因此取其最小公倍数24比特(3字节)为一个循环周期。比特流的划分可用位与和移位操作来实现,对于秘密文件的三个字节位与掩码依次为[224,28,3],[128,112,14,1],[192,56,7],取得掩码之后应作相应的移位操作。下面这段代码是文件隐藏的核心代码,直接体现了算法的中心思想: copyright paper51.com for(DWORDi=54;i<BaseFileLen;i++) //对于位图文件,图像点阵从第54字节开始 内容来自www.paper51.com { 内容来自论文无忧网 www.paper51.com Temp=((HideData[j]&224)>>5)<<5;//第一个“3比特”构成图像的第一字节 paper51.com
BaseData[i]=HideCalculate(BaseData[i],Temp);//进行两文件融合计算 内容来自www.paper51.com i++; //修正宿主信息当前指针(字节为单位) http://www.paper51.com Temp=((HideData[j]&28)>>2)<<5;//第二个“3比特”构成图像的第二字节 内容来自www.paper51.com BaseData[i]=HideCalculate(BaseData[i],Temp); paper51.com i++; copyright paper51.com
Temp=(HideData[j]&3)<<1;//第三个“3比特” 内容来自www.paper51.com j++; //修正隐藏信息当前指针(字节为单位) paper51.com Temp|=(HideData[j]&128)>>7; paper51.com Temp*=32; 内容来自论文无忧网 www.paper51.com BaseData[i]=HideCalculate(BaseData[i],Temp); copyright paper51.com i++; http://www.paper51.com Temp=((HideData[j]&112)>>4)<<5;//第四个“3比特” 内容来自论文无忧网 www.paper51.com BaseData[i]=HideCalculate(BaseData[i],Temp); 内容来自www.paper51.com i++; 内容来自www.paper51.com Temp=((HideData[j]&14)>>1)<<5;//第五个“3比特” http://www.paper51.com BaseData[i]=HideCalculate(BaseData[i],Temp); copyright paper51.com i++; paper51.com Temp=(HideData[j]&1)<<2;//第六个“3比特” 内容来自www.paper51.com j++; 内容来自论文无忧网 www.paper51.com Temp|=(HideData[j]&192)>>6; 内容来自www.paper51.com Temp*=32; http://www.paper51.com BaseData[i]=HideCalculate(BaseData[i],Temp); http://www.paper51.com i++; 内容来自论文无忧网 www.paper51.com Temp=((HideData[j]&56)>>3)<<5;//第七个“3比特” 内容来自www.paper51.com BaseData[i]=HideCalculate(BaseData[i],Temp); 内容来自论文无忧网 www.paper51.com
i++; paper51.com Temp=(HideData[j]&7)<<5;//第八个“3比特” copyright paper51.com BaseData[i]=HideCalculate(BaseData[i],Temp); 内容来自www.paper51.com j++; paper51.com
} 内容来自论文无忧网 www.paper51.com 其中,图像融合计算是在unsignedchar HideCalculate(unsigned char B, unsigned char H);函数中完成的。参数B为宿主信息的内容, H为隐藏信息的内容。计算完成后将融合后的信息返回,该函数的实现编码如下: 内容来自www.paper51.com unsigned charCDataHiderView::HideCalculate(unsigned char B, unsigned char H) 内容来自www.paper51.com { 内容来自www.paper51.com //f2=round(f0*(1-t))+round(f1*t) copyright paper51.com unsigned charR=(int)((1-t)*B+0.5f)+(int)(t*H+0.5f); paper51.com return R; copyright paper51.com
} http://www.paper51.com
4.3 恢复算法 内容来自论文无忧网 www.paper51.com
文件从位图中提取的过程实际是文件隐藏的逆过程。将含有隐含文件的位图和原始位图读入缓存后,先通过信息提取从宿主信息的每个字节恢复出3个比特,然后将这些比特流按次序以8bit/byte的格式组成字节流,从而完成对隐藏信息的恢复: http://www.paper51.com for(DWORDi=54;i<CarrierFileLen;i++) paper51.com { paper51.com Temp=(ShowCalculate(CarrierData[i],BaseData[i])&7)<<5;//提取出第一个“3比特” 内容来自www.paper51.com i++; //宿主信息指针修正(字节为单位) http://www.paper51.com Temp|=(ShowCalculate(CarrierData[i],BaseData[i])&7)<<2;//提取出第二个“3比特” 内容来自论文无忧网 www.paper51.com i++; 内容来自论文无忧网 www.paper51.com
Temp|=(ShowCalculate(CarrierData[i],BaseData[i])&6)>>1;//提取出第三个“3比特” 内容来自www.paper51.com
CarrierData[j]=Temp;//恢复出第一个隐藏字节 http://www.paper51.com
j++; //隐藏信息指针修正(字节为单位) paper51.com Temp=(ShowCalculate(CarrierData[i],BaseData[i])&1)<<7; copyright paper51.com
i++; paper51.com Temp|=(ShowCalculate(CarrierData[i],BaseData[i])&7)<<4;//提取出第四个“3比特” http://www.paper51.com i++; http://www.paper51.com
Temp|=(ShowCalculate(CarrierData[i],BaseData[i])&7)<<1;//提取出第五个“3比特” 内容来自www.paper51.com
i++; copyright paper51.com Temp|=(ShowCalculate(CarrierData[i],BaseData[i])&4)>>2;//提取出第六个“3比特” 内容来自www.paper51.com CarrierData[j]=Temp;//恢复出第二个隐藏字节 内容来自论文无忧网 www.paper51.com j++; http://www.paper51.com
Temp=(ShowCalculate(CarrierData[i],BaseData[i])&3)<<6; paper51.com i++; 内容来自www.paper51.com
Temp|=(ShowCalculate(CarrierData[i],BaseData[i])&7)<<3;//提取出第七个“3比特” copyright paper51.com i++; paper51.com Temp|=ShowCalculate(CarrierData[i],BaseData[i])&7;//提取出第八个“3比特” http://www.paper51.com
CarrierData[j]=Temp;//恢复出第三个隐藏字节 http://www.paper51.com j++; paper51.com } 内容来自www.paper51.com 这里进行信息恢复和误差修正的主要工作是在unsigned char ShowCalculate(unsigned char C, unsignedchar B);函数里完成的。参数C为宿主信息内容,参数B为原始信息内容,返回值为隐藏信息的3个比特(未经移位处理): paper51.com unsigned charCDataHiderView::ShowCalculate(unsigned char C, unsigned char B) paper51.com { copyright paper51.com
//rf1=round((f2-round((1-t)*f0))/t) paper51.com unsigned charR=(int)((C- (int)((1-t)*B+0.5f))/t+0.5f); http://www.paper51.com
if(R%32>15)//误差修正(自动纠错) http://www.paper51.com
R+=15; 内容来自论文无忧网 www.paper51.com R=(int)(R/32.0f+0.5f); paper51.com return R; http://www.paper51.com } paper51.com 经过上述处理,可以将隐藏文件的文件信息和内容从宿主位图恢复到内存,余下的工作只需根据文件头格式将文件有关信息提取出来并据此将文件内容保存到磁盘即可完成任意二进制文件的恢复。 内容来自论文无忧网 www.paper51.com
5 基于一阶贝塞尔曲线的信息隐藏软件的实现 paper51.com 5.1 基本步骤 copyright paper51.com http://www.paper51.com 图5-1 软件实现步骤 内容来自论文无忧网 www.paper51.com 对照需求分析,软件的实现主要为宿主文件的正确选取,待隐藏文件的正确选取,融合过程的成功进行,融合后文件的正确选取,恢复过程的成功进行五部分。实现步骤如图5-1,而其间各种程序的实现也同步进行。首先选择非空BMP位图文件作为宿主文件,因为此软件所选定的宿主文件类型仅为24位BMP位图文件,而大小为0kb的文件不能作为宿主文件使用,同时软件也会提示宿主文件选取错误;当选取待隐藏文件时,各种文件类型均可选取,如.txt文本文件类型、.exe执行文件类型以及各种图像文件类型。若选取的文件过大,超过宿主文件大小的3/8,软件在融合步骤将会提示待隐藏文件大小过大。因此本软件更适合隐藏容量较小的图像文件和文本文件;融合过程的成功进行取决于融合系数的选择,组帧部分的实现如图5-2所示,组帧完毕后将按照参数t=0.035、L=3对组帧后的信息进行融合。一般情况下,融合系数和串长参数在软件原有程序中已确定。融合时,软件提示融合后文件的储存地址,在此要注意为融合后的文件作标记,并确定路径;恢复文件时,必须正确选取融合后的文件,否则软件会提示选取文件有误。恢复过程是融合过程的逆过程,按照组帧信息,确保机密文件的完整性和正确性。同时软件会提示机密文件的储存位置。 paper51.com
http://www.paper51.com 图5-2 组帧原理 paper51.com 5.2 辅助程序段 copyright paper51.com 除信息隐藏、信息恢复以及其他主要程序模块外,相关辅助程序段起到了完善软件的作用,如对话框程序段,文件选择框程序段等。在此介绍的是本实例软件常用到的文件存储路径选择对话框程序和提示框程序,存储选择框图示如图5-3。 内容来自www.paper51.com http://www.paper51.com 图5-3 对话框程序实现效果 内容来自www.paper51.com void CDataHiderView::OnHidefile() 内容来自论文无忧网 www.paper51.com { 内容来自www.paper51.com
CFileDialogdlg(TRUE,"*","*.*",OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,"需隐藏文件(*.*)|*.*||",NULL); copyright paper51.com if(dlg.DoModal()==IDOK) copyright paper51.com
{ 内容来自论文无忧网 www.paper51.com
m_bCanConv2=true; 内容来自www.paper51.com m_sHideFile=dlg.GetPathName(); 内容来自www.paper51.com m_sHideFileName=dlg.GetFileName(); http://www.paper51.com
} 内容来自论文无忧网 www.paper51.com
else copyright paper51.com m_bCanConv2=false; 内容来自www.paper51.com
} paper51.com
它有效的为用户提供了选择和存储功能,对路径这一重要概念提供了技术上的支持。在本实例中每个功能按钮都会提供相应的存储路径提示:选取宿主文件,选取待隐藏文件,嵌入后融和文件的存储位置,选取待恢复文件,保存机密文件。 http://www.paper51.com 提示框主要用途在于告诉用户在操作中发生的错误和证明操作的成功。小小的一个细节,可以很好的引导用户正确使用软件。提示框图示如图5-4: paper51.com http://www.paper51.com 图5-4 提示框示例 http://www.paper51.com |